Jump to content

    
Sign in to follow this  
landrey

большой массив в sizeof

Recommended Posts

Имею следующий кусок кода (упрощенно):

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

Share this post


Link to post
Share on other sites

sizeof() возвращает результат типа int. В вашем случае размер массива структур не может быть представлен типом int, который в AVR 16-битный. Когда вы делаете sizeof(sxModel) * 32 вы получаете переполнение уже в процессе вычисления операции умножения.

Share this post


Link to post
Share on other sites
sizeof() возвращает результат типа int.

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

При компиляции получаю ошибку

Вывод простой и неутешительный - ну не сможет данный контроллер работать(адресовать) с объектом такого размера.

Говорят :), что на свете давно уже есть 32bit контроллеры, причем за меньшие деньги, нежели розовый Cadillac '68 Atmega256.

Share this post


Link to post
Share on other sites
Нет, 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.

 

Share this post


Link to post
Share on other sites
unsigned int размер массива структур должен укладываться, а тут явно упоминается unsigned.

Тут ведь собственно размерность собственно самого size_t сугубо вторична - просто не может быть массив запрашиваемого ( неведомая CONST_M + 32*1300 ) размера и все. Причем все это через enum, который уже не unsigned int. Кроме того, хоть и написано в стандарте "is size_t, defined in <stddef.h>" size_t совершенно не обязательно должен определяться через другие типы - совершенно спокойно он может быть самостоятельным встроенным типом, что помнится сделано и, например, у IAR.

Share this post


Link to post
Share on other sites
Да, чего-то меня переклинило при чтении стандарта:Почему-то я тут 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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this