landrey 0 7 июля, 2010 Опубликовано 7 июля, 2010 · Жалоба Имею следующий кусок кода (упрощенно): 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 7 июля, 2010 Опубликовано 7 июля, 2010 · Жалоба sizeof() возвращает результат типа int. В вашем случае размер массива структур не может быть представлен типом int, который в AVR 16-битный. Когда вы делаете sizeof(sxModel) * 32 вы получаете переполнение уже в процессе вычисления операции умножения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 7 июля, 2010 Опубликовано 7 июля, 2010 · Жалоба sizeof() возвращает результат типа int. Нет, size_t, что в общем случае не int, а нечто достаточное для описания объекта максимального размера. При компиляции получаю ошибку Вывод простой и неутешительный - ну не сможет данный контроллер работать(адресовать) с объектом такого размера. Говорят :), что на свете давно уже есть 32bit контроллеры, причем за меньшие деньги, нежели розовый Cadillac '68 Atmega256. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 7 июля, 2010 Опубликовано 7 июля, 2010 · Жалоба Нет, 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 0 7 июля, 2010 Опубликовано 7 июля, 2010 · Жалоба unsigned int размер массива структур должен укладываться, а тут явно упоминается unsigned. Тут ведь собственно размерность собственно самого size_t сугубо вторична - просто не может быть массив запрашиваемого ( неведомая CONST_M + 32*1300 ) размера и все. Причем все это через enum, который уже не unsigned int. Кроме того, хоть и написано в стандарте "is size_t, defined in <stddef.h>" size_t совершенно не обязательно должен определяться через другие типы - совершенно спокойно он может быть самостоятельным встроенным типом, что помнится сделано и, например, у IAR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 7 июля, 2010 Опубликовано 7 июля, 2010 · Жалоба Да, чего-то меня переклинило при чтении стандарта:Почему-то я тут 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться