Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: большой массив в sizeof
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
landrey
Имею следующий кусок кода (упрощенно):
Код
struct sxModel{
  uint8_t model[1300];
};
typedef sxModel sxModels[32];
enum {
  ...
  CONST_N = CONST_M + sizeof(sxModels),
  ...
};

При компиляции получаю ошибку
Код
Error[Pe095]: array is too large
в строке
Код
CONST_N = CONST_M + sizeof(sxModels),

Если написать как
Код
CONST_N = CONST_M + sizeof(sxModel) * 32,

то ошибок нет. Как такое объяснить? И как такое побороть?
Так же sxModels участвует как составляющая другой структуры. У меня та структура не используется, но она описана в общем хэдере. После исправления на
Код
CONST_N = CONST_M + sizeof(sxModel) * 32,
появляется ошибка в той структуре:
Код
Error[Pe103]: class is too large


Компилятор IAR AVR 5.11, мк mega2560
Сергей Борщ
sizeof() возвращает результат типа int. В вашем случае размер массива структур не может быть представлен типом int, который в AVR 16-битный. Когда вы делаете sizeof(sxModel) * 32 вы получаете переполнение уже в процессе вычисления операции умножения.
zltigo
QUOTE (Сергей Борщ @ Jul 7 2010, 16:23) *
sizeof() возвращает результат типа int.

Нет, size_t, что в общем случае не int, а нечто достаточное для описания объекта максимального размера.
QUOTE
При компиляции получаю ошибку

Вывод простой и неутешительный - ну не сможет данный контроллер работать(адресовать) с объектом такого размера.
Говорят smile.gif, что на свете давно уже есть 32bit контроллеры, причем за меньшие деньги, нежели розовый Cadillac '68 Atmega256.
Сергей Борщ
Цитата(zltigo @ Jul 7 2010, 17:30) *
Нет, size_t, что в общем случае не int, а нечто достаточное для описания объекта максимального размера.
Да, чего-то меня переклинило при чтении стандарта:
Цитата
The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type.The size is determined from the type of the operand.The result is an integer.
Почему-то я тут integer воспринял как int, не дочитав еще пару абзацев:
Цитата
The value of the result is implementation-defined, and its type (an unsigned integer type) is size_t, defined in <stddef.h> (and other headers).
Но вот странно - в unsigned int размер массива структур должен укладываться, а тут явно упоминается unsigned.
zltigo
QUOTE (Сергей Борщ @ Jul 7 2010, 19:08) *
unsigned int размер массива структур должен укладываться, а тут явно упоминается unsigned.

Тут ведь собственно размерность собственно самого size_t сугубо вторична - просто не может быть массив запрашиваемого ( неведомая CONST_M + 32*1300 ) размера и все. Причем все это через enum, который уже не unsigned int. Кроме того, хоть и написано в стандарте "is size_t, defined in <stddef.h>" size_t совершенно не обязательно должен определяться через другие типы - совершенно спокойно он может быть самостоятельным встроенным типом, что помнится сделано и, например, у IAR.
ReAl
Цитата(Сергей Борщ @ Jul 7 2010, 19:08) *
Да, чего-то меня переклинило при чтении стандарта:Почему-то я тут integer воспринял как int, не дочитав еще пару абзацев: Но вот странно - в unsigned int размер массива структур должен укладываться, а тут явно упоминается unsigned.
Если я правильно понимаю политику партии, там кроме size_t замешан ещё ptrdiff_t.
Объекты sxModels[0].model[0] и sxModels[31].model[1299] находятся внутри одного агрегата и взятие разности их адресов допустимо.
Причём как в виде &sxModels[0].model[0] - &sxModels[31].model[1299] (отрицательная) так и в виде &sxModels[31].model[1299] - &sxModels[0].model[0] (положительная). И она тоже не даёт размеру объекта вылезть за некоторые рамки.
Почему size_t при этом допускает больший размер, чем ptrdiff_t — не знаю.

p.s. даже если бы объекты были не байтовыми, (unisgned char*)&top_subobject - (unisgned char*)&bott_subobject дпустимо и должно дать число, представимое в ptrdiff_t
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.