Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > В чём разница между массивом и указателем


Автор: Курсант 4.4.2018, 21:43
Всем доброго времени суток.

В проекте под микроконтроллер возникла необходимость использовать одни и те же массивы в разных программных модулях. Вроде бы решается такая задача через EXTERN. Например так:
Код

extern int32_t* Coefficients;

или так:
Код

extern int32_t Coefficients[NUM_OF_COEFFICIENTS];

или так:
Код

extern int32_t Coefficients[];

Проблема в том, что при разных объявлениях внешнего массива в других модулях программа начинает работать по-разному. Дело в том, что в этих модулях указатель на массив передаётся в качестве параметра другим функциям. И возникает трабла.. А именно, при объявлении
Код

extern int32_t* Coefficients;

неправильно работают инструкции вида
Код

Coefficients[COEFFICIENT_INDEX] = DEFAULT_COEFFICIENT_INDEX;

запись производится куда-то не туда. А при объявлении вида
Код

extern int32_t Coefficients[NUM_OF_COEFFICIENTS];

Перестают работать функции вида
Код

CalculateCheckSum ( Coefficients, NUM_OF_COEFFICIENTS);

Он вообще какие-то нули суммирует, а иногда и выпадает в HardFault, т.е. скорее всего вылетает за границы допустимых для чтения адресов.

Вот что это вообще может быть? Я в шоке, если честно...

Автор: volatile 5.4.2018, 11:07
Вангую, у вас модули загружаются не в том порядке, как вам кажется.
Порядок загрузки модулей вообще не определен в Си, и чтоб обеспечить правльную загрузку нужно прибегать к определенным способам.
А лучше вообще не писать программы, зависящие от порядка загрузки модулей.

Автор: Курсант 5.4.2018, 14:01
Цитата(volatile @ 5.4.2018,  11:07)
Вангую, у вас модули загружаются не в том порядке, как вам кажется.
Порядок загрузки модулей вообще не определен в Си, и чтоб обеспечить правльную загрузку нужно прибегать к определенным способам.
А лучше вообще не писать программы, зависящие от порядка загрузки модулей.

Всё заработало, как всегда "дело было не в бобине - разгильдяй сидел в кабине". Нашёл ошибки в указателях. Ну как всё, ещё глюки остались, но это уже совсем другая история.

И да, похоже, никакой разницы действительно не было, как объявлять эти самые "внешние" массивы, как указатель на целочисленный тип или как массив.

Очень интересно, я не понял смысла слова "загружается" в контексте прошивки микроконтроллера. Кмк, просто из объектных файлов собирается и линкуется программа - экзешник там, хекс или ещё что... Нет?

Автор: volatile 5.4.2018, 14:29
Цитата(Курсант @  5.4.2018,  14:01 Найти цитируемый пост)
чень интересно, я не понял смысла слова "загружается"

я имел в виду начальную инициализацию.

допустим, в одном модуле:
Код

int a = 2;


в другом:
Код

extern int a;
int b = a; // не факт что здесь b будет равен 2.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)