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

Keil. Объявление внешних констант.

В одном модуле объявляю массив констант с его инициализацией:

 

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).

 

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

 

 

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


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

extern const TLimit WeightChannelTableLimits[WEIGHT_RAMETER_LENGTH];

 

extern const TLimit WeightChannelTableLimits[];

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


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

Пробовал, то же самое.

А так

extern TLimit WeightChannelTableLimits[];

 

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

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


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

А так
extern TLimit WeightChannelTableLimits[];

 

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

 

Пробовал и так. Работает только в том случае, если убираю в основном объявлении модификатор "const", но тогда это уже переменная, и попадает она в другой сегмент.

А что значит "через header"? Я и так объявляю внешнюю константу в "communicate.h" и прописываю его в модуле "communicate.cpp".

 

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


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

Работает только в том случае, если убираю в основном объявлении модификатор "const", но тогда это уже переменная, и попадает она в другой сегмент.

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

 

extern TLimit WeightChannelTableLimits[];

 

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

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


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

Поместите

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}
};

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


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

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

 

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

 

extern TLimit WeightChannelTableLimits[];

 

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

 

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

 

 

Поместите

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}
};

 

Спасибо, сработало. Ещё если бы и объяснили, почему?

 

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


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

Спасибо, сработало. Ещё если бы и объяснили, почему?

Не знаю. Нашёл экспериментально. У меня GCC и проблема точно такая же была.

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


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

А какая версия кейла?

Проверил на 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 выполняется "автоматически".

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


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

Спасибо, сработало. Ещё если бы и объяснили, почему?

Это одно из тонких отличий С от С++.

В плюсах у переменной с const область видимости ограничена единицей компиляции, как если бы она была объявлена со static.

Чтобы сделать её глобальной нужно писать extern const

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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