Вячик13 0 17 января, 2012 Опубликовано 17 января, 2012 · Жалоба В одном модуле объявляю массив констант с его инициализацией: 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 0 17 января, 2012 Опубликовано 17 января, 2012 · Жалоба extern const TLimit WeightChannelTableLimits[WEIGHT_RAMETER_LENGTH]; extern const TLimit WeightChannelTableLimits[]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Вячик13 0 17 января, 2012 Опубликовано 17 января, 2012 · Жалоба extern const TLimit WeightChannelTableLimits[]; Пробовал, то же самое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
am1808 0 17 января, 2012 Опубликовано 17 января, 2012 · Жалоба Пробовал, то же самое. А так extern TLimit WeightChannelTableLimits[]; в противном случае - через header Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Вячик13 0 17 января, 2012 Опубликовано 17 января, 2012 · Жалоба А так extern TLimit WeightChannelTableLimits[]; в противном случае - через header Пробовал и так. Работает только в том случае, если убираю в основном объявлении модификатор "const", но тогда это уже переменная, и попадает она в другой сегмент. А что значит "через header"? Я и так объявляю внешнюю константу в "communicate.h" и прописываю его в модуле "communicate.cpp". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
am1808 0 17 января, 2012 Опубликовано 17 января, 2012 · Жалоба Работает только в том случае, если убираю в основном объявлении модификатор "const", но тогда это уже переменная, и попадает она в другой сегмент. да не может быть extern TLimit WeightChannelTableLimits[]; т.е. вы хотите сказать, что вы в другом модуле значения в экспортируемом массиве можете изменить, когда вы его определили как const? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maksimp 0 17 января, 2012 Опубликовано 17 января, 2012 · Жалоба Поместите 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 0 17 января, 2012 Опубликовано 17 января, 2012 · Жалоба да не может быть И тем не менее - факт. Я понимаю, что это не укладывается в стандартные правила Си. Сам удивлён. 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} }; Спасибо, сработало. Ещё если бы и объяснили, почему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maksimp 0 17 января, 2012 Опубликовано 17 января, 2012 · Жалоба Спасибо, сработало. Ещё если бы и объяснили, почему? Не знаю. Нашёл экспериментально. У меня GCC и проблема точно такая же была. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 17 января, 2012 Опубликовано 17 января, 2012 · Жалоба А какая версия кейла? Проверил на 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 6 17 января, 2012 Опубликовано 17 января, 2012 · Жалоба Спасибо, сработало. Ещё если бы и объяснили, почему? Это одно из тонких отличий С от С++. В плюсах у переменной с const область видимости ограничена единицей компиляции, как если бы она была объявлена со static. Чтобы сделать её глобальной нужно писать extern const Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться