23.08.2012, 18:19
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Сообщение от Yurkin2007
|
Размер массива data известен. Размер передавемого функции параметра data неизвестен.
|
Нет, "линия водораздела" проходит иначе. И размер массива, и размер параметра компилятору известен - иначе он не смог бы правильно распределить память под массив и под параметр, а вот какой именно массив будет передан функции и какого именно он будет размера, сама функция предполагать не имеет права (ведь в разных вызовах м.б. переданы разные массивы - data1, data2 и т.д.). Кстати, именно по этой причине рассчитывать на то, что
Сообщение от Yurkin2007
|
размер будет известен ... при вызове функции при выполнении программы.
|
ей нельзя!
Сообщение от Yurkin2007
|
Ну, дык, просветите меня, пожалуйста, если это, конечно, не военная тайна!
|
Это не военная тайна и я, как минимум, на предыдущей странице написал, какой раздел нужно почитать, чтобы не совершать этих ошибок.
Переписывать этот раздел сюда из учебника я не буду, так как это абсолютно бессмыссленное занятие - у меня оно временя отнимет, а никому из участников не сэкономит, так как чтение этого раздела займет одинаковое время, что из книги, что со страниц этого топика. Неужели это не очевидно?
__________________
There's always more than one way to skin a cat.
|
|
|
|
23.08.2012, 18:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Т.к. страница перелистнулась, пока я писал, пост, на который я ссылался, оказался не на предыдущей, а на предпредыдущей странице... :о)
__________________
There's always more than one way to skin a cat.
|
|
|
|
23.08.2012, 18:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.06.2008
Сообщений: 1,530
Сказал спасибо: 78
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Сообщение от tempora
|
сама функция предполагать не имеет права (ведь в разных вызовах м.б. переданы разные массивы - data1, data2 и т.д.).
|
Ясней не скажешь! ![Прикольно](images/smilies/icon_wink3.gif)
В общем случае определить размер матрицы можно так:
Код:
|
[typeofdata] data[];
size=sizeof(data)/sizeof(data[0]); |
|
|
|
|
23.08.2012, 19:09
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Ну, так как увж.tempora не раскололся, внесу ясность: sizeof(var) возвращает размер переменной в байтах. И если массив состоит из char, то его размер равен числу элементов массива. Что, собственно, и подразумевалось на протяжении нескольких последних страниц.
|
|
|
|
23.08.2012, 19:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Сообщение от Yurkin2007
|
Что, собственно, и подразумевалось
|
Вот как раз подразумевать-то и не следует, так как "подразумеваемое" компилятору неизвестно. Скажем, если через пару дней (недель) ТС станет посылать sms-ки с русскими буквами, размер массива в байтах и количество элементов в нем уже не будут равны (cм. добавление). А вот определение "sizeof(array)/sizeof(array[0])" останется верным и при переходе к multibyte-массивам.
_____________________
++: та же беда произойдёт, при переносе этого приёма на любые массивы, элементы которых имеют рамер отличный от 1 байта.
__________________
There's always more than one way to skin a cat.
Последний раз редактировалось tempora; 23.08.2012 в 19:23.
|
|
|
|
23.08.2012, 20:02
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Сообщение от tempora
|
Вот как раз подразумевать-то и не следует
|
Я так и думал, что весь сыр-бор из-за этого.
Не, ну, чё , блин, за наезд-то?!? ![Учучь на ошибках](images/smilies/icon_fingal.gif)
Засели старпёры, гнобят молодёжь!
Я где-нибудь утверждал, что sizeof(array) возвращает количество элементов array?
|
|
|
|
23.08.2012, 20:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.06.2008
Сообщений: 1,530
Сказал спасибо: 78
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Боюсь, что с с массивом неопределенной длины sizeof не работает, в таком случае применение этого оператора, как мне кажется, вообще бессмысленно.
|
|
|
|
23.08.2012, 20:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Сообщение от nonamedov
|
Боюсь, что с с массивом неопределенной длины sizeof не работает, в таком случае применение этого оператора, как мне кажется, вообще бессмысленно.
|
У каждого оператора есть свое назначение, за пределами которого он неприменим, но это не делает его бессмысленным.
Сообщение от Yurkin2007
|
Я так и думал, что весь сыр-бор из-за этого.
|
То есть, с массивами, указателями, константными выражениями, областями видимости, передачей параметров и временем/способом определения компилятором размеров памяти, выделяемой под данные, у вас проблем нету?
Сообщение от Yurkin2007
|
Не, ну, чё , блин, за наезд-то?!?![Учучь на ошибках](images/smilies/icon_fingal.gif)
Я где-нибудь утверждал, что sizeof(array) возвращает количество элементов array?
|
Так считал ТС, когда делил массив на три группы элементов:
Код:
|
...
len=sizeof(data)/3;
for(i=0; i‹len; i++)
{
a0 = data[i*3];
... |
и никто (в том числе и вы, любезный) его не поправил - так и продолжали писать sizeof там, где высчитывалось количество элементов массива, из чего логично следует предположение, что все это пишущие считают будто sizeof возвращает размерность, а не размер.
Сообщение от Yurkin2007
|
Засели старпёры, гнобят молодёжь!
|
Вам подсказывают, как не расставлять грабли на своём пути.
__________________
There's always more than one way to skin a cat.
Последний раз редактировалось tempora; 23.08.2012 в 21:05.
|
|
|
|
23.08.2012, 21:21
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Ну, есть же очевидные вещи. ТС объявил массив data, состоящий из char, и определяет его длину как прекрасно представляя себе, что размер элемента равен 1 байту. Будет другой размер элемента - будем делить на его размер, это ежу понятно.
По-Вашему, правильнее было бы написать при этом, не объясняя своей позиции, делать таинственные глаза и отправлять читать учебники! ![Прикольно](images/smilies/icon_wink3.gif)
Ну, совершенно не в строчку Ваши замечания, к тому же они не ответили на вопрос ТС о неработающей программе и увели дискуссию в сторону...
Последний раз редактировалось Yurkin2007; 23.08.2012 в 21:26.
|
|
|
|
23.08.2012, 21:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Уроки СИ для AVR микроконроллеров
Сообщение от Yurkin2007
|
По-Вашему, правильнее было бы написать при этом, не объясняя своей позиции, ...
|
Правильный вариант уже неоднократно упоминался - " sizeof(array)/sizeof(array[0])". Позицию свою я объяснил.
Сообщение от Yurkin2007
|
... Ваши замечания, ... увели дискуссию в сторону...
|
Наоборот - я привел точный перечень ошибок разных "советчиков", чем вернул т.н. "дискуссию" из области, где одна ошибка накладывалась на другую, к существу проблем ТС.
__________________
There's always more than one way to skin a cat.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:10.
|
|