C ++ массив указателей на массив на ограниченной платформе памяти (arduino) - PullRequest
10 голосов
/ 26 февраля 2012

для каждой буквы в алфавите у меня есть int-массив, объявленный так:

int const  A[64] ={ 
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,1,1,1,0,0,0,0,
    0,1,0,1,0,0,0,0,
    0,1,1,1,0,0,0,0,
    0,1,0,1,0,0,0,0,
    0,1,0,1,0,0,0,0,
    0,0,0,0,0,0,0,0
};

, затем я создаю другой массив с указателями на них.

int const * text[] = { A, B, C };

это работает отличнодо тех пор, пока этот текстовый массив не достигнет определенного числа различных записей.

, например, это работает:

int const * text[] = { A, A, A, A, A, A, A, A }; // could even go on much longer

, но происходит сбой:

int const * text[] = { A, B, C, D }; // it seems the number of different entries matters

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

обратите внимание, что это выполняется на платформе arduino, которая имеет очень ограниченную память.

1 Ответ

2 голосов
/ 26 февраля 2012

Я подозреваю, что поиск в массиве с идентичными элементами оптимизируется;Если бы int const *text[]; было объявлено в заголовочном файле и скомпилировано (определено) в отдельном объектном файле, вы, вероятно, увидите ту же проблему.Линкер делает все возможное, но все эти данные, вероятно, перекрываются с пространством кучи / стека.

По крайней мере с avr-libc (с использованием avr-gcc, avr-binutils), есть макросыили переменные атрибуты, которые могут размещать такие постоянные данные в гораздо большем, доступном только для чтения программном пространстве (флэш-ПЗУ).

...