Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Keil. Объявление внешних констант.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Вячик13
В одном модуле объявляю массив констант с его инициализацией:

const TLimit WeightChannelTableLimits[WEIGHT_RAMETER_LENGTH] = {
{0.0,0.0},
{0.0,0.0},
{0.0,0.0},
{0.0,0.0},
{0.0,0.0},
{0.0,0.0},
{0.0,0.0},
{0.0,0.0}
};

и использую. Всё нормально.

В другом модуле "communicate.cpp" объявляю его внешним:

extern const TLimit WeightChannelTableLimits[WEIGHT_RAMETER_LENGTH];

и пытаюсь использовать.

Линкер ругается:

Error: L6218E: Undefined symbol WeightChannelTableLimits (referred from communicate.o).

Почему? Как надо правильно?

am1808
Цитата(Вячик13 @ Jan 17 2012, 11:22) *
extern const TLimit WeightChannelTableLimits[WEIGHT_RAMETER_LENGTH];


extern const TLimit WeightChannelTableLimits[];
Вячик13
Цитата(am1808 @ Jan 17 2012, 09:42) *
extern const TLimit WeightChannelTableLimits[];


Пробовал, то же самое.
am1808
Цитата(Вячик13 @ Jan 17 2012, 11:55) *
Пробовал, то же самое.

А так
Код
extern TLimit WeightChannelTableLimits[];


в противном случае - через header
Вячик13
Цитата(am1808 @ Jan 17 2012, 10:05) *
А так
Код
extern TLimit WeightChannelTableLimits[];


в противном случае - через header


Пробовал и так. Работает только в том случае, если убираю в основном объявлении модификатор "const", но тогда это уже переменная, и попадает она в другой сегмент.
А что значит "через header"? Я и так объявляю внешнюю константу в "communicate.h" и прописываю его в модуле "communicate.cpp".
am1808
Цитата(Вячик13 @ Jan 17 2012, 12:13) *
Работает только в том случае, если убираю в основном объявлении модификатор "const", но тогда это уже переменная, и попадает она в другой сегмент.

да не может быть biggrin.gif

Код
extern TLimit WeightChannelTableLimits[];


т.е. вы хотите сказать, что вы в другом модуле значения в экспортируемом массиве можете изменить, когда вы его определили как const?
maksimp
Поместите
Код
extern const TLimit WeightChannelTableLimits[WEIGHT_RAMETER_LENGTH];

или просто
Код
extern const TLimit WeightChannelTableLimits[];

в каждый из файлов - и тот где объявляется и тот где используется.

То есть в первом файле прямо пишите:

Код
extern const TLimit WeightChannelTableLimits[];
const TLimit WeightChannelTableLimits[WEIGHT_RAMETER_LENGTH] = {
{0.0,0.0},
{0.0,0.0},
{0.0,0.0},
{0.0,0.0},
{0.0,0.0},
{0.0,0.0},
{0.0,0.0},
{0.0,0.0}
};
Вячик13
Цитата(am1808 @ Jan 17 2012, 10:19) *
да не может быть biggrin.gif

И тем не менее - факт. Я понимаю, что это не укладывается в стандартные правила Си. Сам удивлён.

Код
extern TLimit WeightChannelTableLimits[];


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


Нет, я хочу сказать, что мне как раз не нужно чтобы эти значения изменялись. Кроме того, я хочу чтобы они хранились в сегменте, который лежит в флэше. В принципе можно и убрать модификатор "const", и тогда при каждом старте программы всё равно будет происходить инициализация, но некрасиво, поскольку значения будут лежать в RAM памяти, и будет отсутствовать контроль попыток их изменения.


Цитата(maksimp @ Jan 17 2012, 10:28) *
Поместите
Код
extern const TLimit WeightChannelTableLimits[WEIGHT_RAMETER_LENGTH];

или просто
Код
extern const TLimit WeightChannelTableLimits[];

в каждый из файлов - и тот где объявляется и тот где используется.

То есть в первом файле прямо пишите:

Код
extern const TLimit WeightChannelTableLimits[];
const TLimit WeightChannelTableLimits[WEIGHT_RAMETER_LENGTH] = {
{0.0,0.0},
{0.0,0.0},
{0.0,0.0},
{0.0,0.0},
{0.0,0.0},
{0.0,0.0},
{0.0,0.0},
{0.0,0.0}
};


Спасибо, сработало. Ещё если бы и объяснили, почему?
maksimp
Цитата(Вячик13 @ Jan 17 2012, 12:40) *
Спасибо, сработало. Ещё если бы и объяснили, почему?

Не знаю. Нашёл экспериментально. У меня GCC и проблема точно такая же была.
esaulenka
А какая версия кейла?
Проверил на 3.85 (проекты так на 4-ю не перевели...)

В одном сишнике
Код
typedef struct { float a; float b; } TLimit;
const TLimit WeightChannelTableLimits[8] = {
{0.0,0.0},
...


В другом
Код
typedef struct { float a; float b; } TLimit;
extern const TLimit WeightChannelTableLimits[8];
...

i = WeightChannelTableLimits[1].a;

Собралось без проблем.

Вообще-то хорошим тоном является объявление extern WeightChannelTableLimits в хидере того модуля, где задаётся сам массив. Тогда рекомендация maksimp выполняется "автоматически".
SSerge
Цитата(Вячик13 @ Jan 17 2012, 15:40) *
Спасибо, сработало. Ещё если бы и объяснили, почему?

Это одно из тонких отличий С от С++.
В плюсах у переменной с const область видимости ограничена единицей компиляции, как если бы она была объявлена со static.
Чтобы сделать её глобальной нужно писать extern const
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.