Перейти к содержанию
    

Как определить массив больше 32768 значений?

Есть Atmega2561, внешняя память и сам чип позволяют адресовать до 64К ОЗУ.

В то же время не могу определить массив

__no_init byte array[40000];

 

Компилятор IAR для AVR ругается "array is too large".

 

Можно ли как-нибудь обойти ограничение в 32768 значений и определить байтовый массив до 64К?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нафига вообще определять такой массив.

Определите указатель на эту область памяти и все.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Компилятор IAR для AVR ругается "array is too large".
Да. Согласно стандарту максимальный размер массива - INT_MAX. Обойти никак. Вы можете сделать структуру из нескольких массивов и через приведение указателей обращаться к массивам как к одному сплошному через *(ptr+index), при обращении же через ptr[index] index будет трактоваться как знаковое число. Я так думаю.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Согласно стандарту максимальный размер массива - INT_MAX.

Здесь - иное. Например, массив типа int нельзя создать с числом элементов больше чем 16383, для float - 8191...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здесь - иное. Например, массив типа int нельзя создать с числом элементов больше чем 16383, для float - 8191...
Всё правильно, здесь именно «это». Максимальный размер массива — INT_MAX байтов.

Максимальное число элементов типа T — INT_MAX / sizeof(T)

Причина: в языке C разница двух указателей имеет тип int (именно знаковая) и допустима для любых двух (под)элементов одного агрегата (включая элемент сразу за последним элементом массива). Учитывая возможность приведения к char*.

Вот и получается, что раз разница двух приведённых к char* указателей должна влазить в int, то и размер (в смысле sizeof() — размера объекта) любого агрегата — массива или структуры — не может превышать INT_MAX.

Всё остальное — расширения языка.

 

Вы можете сделать структуру из нескольких массивов
Нельзя.

struct {
    char a[XXX];
    char b[YYY];
} foo;
ptrdiff_t d1 = &foo.b[YYY] - &foo.a[0];
ptrdiff_t d2 = &foo.a[0] - &foo.b[YYY];

Для того, чтобы можно было получить обе разности, должно быть sizeof(foo) <= INT_MAX

 

upd:

Тьху, это уже (ещё) привычка равенства размера указателя и int работает.

 

Строго говоря, не int, а таки ptrdiff_t, так что на x86_64 можно и больше, чем INT_MAX, там sizeof(int) = 4 а sizeof(void*) = 8

 

Так что вполне может быть «модель памяти» для 8- или 16-битной архитектуры, у которой указатель по умолчанию 24-или-более-битный и объект может занимать больше INT_MAX. С такими вещами сталкивался, но никогда не пользовался ввиду неэффективности и поэтому забыл.

 

В большинстве случаев таки упор в INT_MAX.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... при обращении же через ptr[index] index будет трактоваться как знаковое число. Я так думаю.

А какая разница, если адрес 16-битный? Пусть как хочет его трактует, но адресует-то всё-равно правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё правильно, здесь именно «это».

Я с Вами соглашусь, если Вы объясните: при чём здесь INT_MAX ?

Имхо: размер определяется типом size_t (и значением SIZE_MAX), а разность указателей - типом ptrdiff_t

 

В компиляторе IAR для mega2561:

typedef size_t unsigned long

typedef ptrdiff_t signed long

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...