реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> большой массив в sizeof
landrey
сообщение Jul 7 2010, 12:33
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 10-11-07
Из: Харьков
Пользователь №: 32 220



Имею следующий кусок кода (упрощенно):
Код
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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 7 2010, 13:23
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 7 2010, 14:30
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Сергей Борщ @ Jul 7 2010, 16:23) *
sizeof() возвращает результат типа int.

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

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 7 2010, 16:08
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 7 2010, 16:21
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 7 2010, 19:53
Сообщение #6


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Сергей Борщ @ 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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 13:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01422 секунд с 7
ELECTRONIX ©2004-2016