Разработка, производство и продажа радиоэлектронной аппаратуры
|
Карта сайта
|
Пишите нам
|
В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:
jobsmp@pochta.ru
Телесистемы
|
Электроника
|
Конференция «Микроконтроллеры и их применение»
В CV AVR функция sizeof() возвращает размрность массива или нет? Что то цикл от нуля до sizeof() работать не хочет...
Отправлено
Dikoy
22 февраля 2008 г. 14:25
Составить ответ
|
Вернуться на конференцию
Ответы
Цикл надо до sizeof(array) / sizeof(array[0]);
—
vmp
(22.02.2008 14:35:41
87.245.155.198
,
пустое
)
классики рекомендуют sizeof(array)/sizeof(*array)
—
koyodza
(22.02.2008 16:03:20
195.214.197.203
, 144 байт)
А... То есть он мне сейчас возвращает сумму длин всех переменных массива?
—
Dikoy
(22.02.2008 14:40:50
194.186.243.194
,
пустое
)
С учётом выравнивания. Т.е. если элемент массива - struct A { int i; char a; }, то при двухбайтовом int sizeof(struct A) даст 4 и при массиве struct A a[10]; sizeof(a) даст 40.
—
ReAl
(22.02.2008 15:39:53
193.111.248.46
,
пустое
)
Это, к примеру, на 16-битном процессоре или на любом другом с выравниванием по умолчанию на 16 бит.
—
ReAl
(22.02.2008 15:40:46
193.111.248.46
,
пустое
)
У меня AVRка простая.
—
Dikoy
(22.02.2008 15:46:1
194.186.243.194
,
пустое
)
Массив чаровский, то есть элементы по 8 бит.
—
Dikoy
(22.02.2008 15:46:35
194.186.243.194
,
пустое
)
Во! Сделал как vmp писал и кажется поехало:
—
Dikoy
(22.02.2008 15:52:27
194.186.243.194
, 1049 байт)
Ну да. И вообще #define ARRAY_LEN(a) (sizeof(a)/sizeof(a[0]))
—
ReAl
(22.02.2008 16:38:47
193.111.248.46
,
пустое
)
Грубо говоря - общий размер памяти в байтах, занимаемый массивом.
—
vmp
(22.02.2008 14:44:3
87.245.155.198
,
пустое
)
А sizeof оптимизируется компилятором (заменяется константой) в процессе компиляции или нет для статического массива?..
—
Dikoy
(22.02.2008 14:57:42
194.186.243.194
,
пустое
)
Он и есть константа.
—
Artem-1.6E-19
(22.02.2008 15:05:22
209.160.64.220
,
пустое
)
Должен заменяться. Как в CV - не знаю, с ним не работал.
—
vmp
(22.02.2008 15:01:6
87.245.155.198
,
пустое
)
Судя по ассемблерному листингу он его вообще не откомпилил... :(
—
Dikoy
(22.02.2008 15:21:37
194.186.243.194
, 2300 байт)
sezeof() должна возвращать размер переменной. Если переменная - указатель на массв, должна вернуть размер указателя.
—
Artem-1.6E-19
(22.02.2008 14:33:54
209.160.64.220
,
пустое
)
Иными словами, как мне получить размер массива? Массив статический, можно через дефайн, конечно, размер задать. Но через sizeof удобнее. Она всё равно оптимизируется при компиляции.
—
Dikoy
(22.02.2008 14:39:28
194.186.243.194
,
пустое
)
Не верь Артёму. Он Си не знает.
—
vmp
(22.02.2008 14:43:14
87.245.155.198
, 870 байт)
Сам то, понял что процитировал? :)
—
Artem-1.6E-19
(22.02.2008 14:48:39
209.160.64.220
,
пустое
)
Конечно. А я ещё и по английски читать умею.
—
vmp
(22.02.2008 14:55:1
87.245.155.198
, 2268 байт,
ссылка
)
Ну а теперь скажи что именно я не так написал?
—
Artem-1.6E-19
(22.02.2008 15:04:40
209.160.64.220
,
пустое
)
"массив" в С - штука интересная. Если взять только имя массива, то в выражениях, где ожидается указатель - это указатель на его первый элемент (в том числе структуру, другой массив - т.е. не на байт, а именно на элемент), а если это имя стоит в sizeof - то возвращается размер массива в единицах sizeof(char) (а не в байтах) с учётом выравнивания элемента массива (+)
—
ReAl
(22.02.2008 15:36:48
193.111.248.46
, 148 байт)
"SIZEOF(OBJECT) выдает целое, равное размеру указанного объекта. (Размер определяется в неспецифицированных единицах, называемых "байтами", которые имеют тот же размер, что и переменные типа CHAR)." - Крниган, Ричи.
—
Леонид Иванович
(22.02.2008 16:13:43
87.252.227.59
,
пустое
)
Конечно. Но только размер стурктуры в общем случае не равен сумме размеров её элементов. Поэтому при выравнивании на два "байта" sizeof(int)==2 для указанной структуры из int + char возвращённое sizeof будет 4 а не 3 и дальше с массивом аналогично.
—
ReAl
(22.02.2008 16:44:9
193.111.248.46
,
пустое
)
Тху. Ну не важно. Просто сейчас уже настолько привычно, что "байт == 8 бит", что и я стал на эту тему заедать.
—
ReAl
(22.02.2008 16:45:17
193.111.248.46
,
пустое
)
т.е. sizeof(char) == 1 по определению, но эта единичка может быть равна двум "нынешним байтам".
—
ReAl
(22.02.2008 16:51:59
193.111.248.46
,
пустое
)
Не размер указателя, а размер того, на что он указывает.
—
vmp
(22.02.2008 15:11:42
87.245.155.198
,
пустое
)
Как sizeof может это узнать вообще?
—
Artem-1.6E-19
(22.02.2008 15:16:23
209.160.64.220
, 185 байт)
Отправка ответа
Имя*:
Пароль:
E-mail:
Тема*:
Сообщение:
Ссылка на URL:
URL изображения:
если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
увеличьте 3 в два раза:
Перейти к списку ответов
|
Конференция
|
Раздел "Электроника"
|
Главная страница
|
Карта сайта
Web
telesys.ru