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

PS. обявление переменной и использование ее должно быть точно так как указано выше..!!!
да .. и фиктивно использовать ее в файле где она объявлена нет необходимости и не хочется (хотя это и помогает)? sm.gif
zltigo
1) прочитать любой букварь. Области видимости переменных, static, extern, const, volatile....Сие есть основа основ.
2) если вдруг! непонятно, то спросить в разделе для начинающих программировать.
Lexy_one
Я конечно извиняюсь... но зачем так жестко.... .. неужели у вас не было не каких проблемм... и ни кто вам ни чего не подсказывал... а вы так сразу "Мы такие крутые!!! А вы ни чего не ШАРИТЕ"
PS.. а на счет области видимости... пробовал.. и если бы помоголо, то как на ваш взгляд? задавал бы я етот вопрос или нет ......?????
MrYuran
Чтобы переменная была видна из другого модуля, там (в другом модуле) она должна быть объявлена с квалификатором extern.
Тогда компилятор не обращает на неё внимания, зная, что она размещена где-то в другом месте.
Другими словами:
В module.с определяете переменную, а в module.h повторяете определение, но с extern.
Во внешнем модуле подключаете #include module.h
Насчёт букварей всё правильно, зря обижаетесь.
Цитата(Lexy_one @ Jul 4 2011, 19:02) *
да .. и фиктивно использовать ее в файле где она объявлена нет необходимости и не хочется (хотя это и помогает)? sm.gif

это как? Поясните.
И ошибку покажите конкретно, а не "типа не объявлена".
variable not defined или всё-таки undefined reference?
zltigo
QUOTE (Lexy_one @ Jul 5 2011, 09:09) *
Я конечно извиняюсь... но зачем так жестко.... .. неужели у вас не было не каких проблемм...

Нет. Я просто сначала прочитал букварь, а потом начал писать. После чего еще неоднократно перечитывал. Причем читал именно учебник K&R, а не настенные календари с готовыми рецептами для "обучения профессиональному программированию на Си за 21 день в картинках"
QUOTE
и ни кто вам ни чего не подсказывал...

Никто sad.gif, тяжелое детство, отсутствие интернета, тоталитарный режим sm.gif .... Только K&R, документация к компилятору и чуть позже тоже бумажный стандарт СЭВ языка Cи.
QUOTE
PS.. а на счет области видимости... пробовал.. и если бы помоголо, то как на ваш взгляд? задавал бы я етот вопрос или нет ......?????

Можете методом тыка и дальше подбирать буквы - нельзя сказать, что не сможете угадать. Но лучше понять и сделать. На данный момент Вы не смогли даже описать сколь-нибудь понятным языком, как Вы себе представляли решение и что делали. Нет даже предмета для обсуждения. Посему читать букварь, как минимум до состояния, когда сможете описать "проблему" на общепринятом языке. Ключевые слова на которые следует обратить внимание были названы.
Lexy_one
объясняю конкретней:

файл 1 с обявлением переменной:
.....
#define _L12_var_lokation_BAT_RAM _L11_var_lokation_BAT_RAM + _Int32U

__no_init Int32U ScArtLoadLastInstAmount @ _L12_var_lokation_BAT_RAM;

#define _L13_var_lokation_BAT_RAM _L12_var_lokation_BAT_RAM + _Int32U
.....

файл 2 с использованием переменной переменной:

.....
extern Int32U ScArtLoadLastInstAmount;
...
void funct_0(void)
{
...
ScArtLoadLastInstAmount = 0;
...
}
...
.....

Выдает ошыбку:
Error[Li005]: no definition for "ScArtLoadLastInstAmount" [referenced from D:\_WORK\...\Debug\Obj\base_....o]

.....................................................................

На счет использования:
если в файле 1 написать строку с использованием этой переменной
(например ScArtLoadLastInstAmount = 0;)
то ошибки не возникает!

P.S.
По поводу букварей: Читал много чего например Rex Jaeschke "The Dictionary of Standard C" - кстати очень хороший справочник... а справочники типа "Си за 21 день в картинках" принципиально не читаю...!
zltigo
QUOTE (Lexy_one @ Jul 5 2011, 12:28) *
а справочники типа "Си за 21 день в картинках" принципиально не читаю...!

ээээээ беру свои слова обратно - Вам можно читать, по крайней мере узнали-бы слово "структура", а то полный мрак sad.gif.
Для анального использования анально объявленной переменной Вам следует добавить квалификатор __root. Что это такое - читать документацию на компилятор.

P.S.
QUOTE
Выдает ошыбку:

Эту ошибку выдает Линкер, а не компилятор - надо-бы уяснить разницу между ними.
MrYuran
А компилятор какой? IAR?
Вот наткнулся тут немного, у вас случайно Misra C не включено?
А то есть интересный документ

В частности, там рекомендуется использовать
#pragma location = addr
вместо @addr
Lexy_one
Да компилятор IAR. Misra C не включен.
За файлик спасибо... посмотрю...

На счет переменной: помогло использование атрибута __root.
Спасибо за помощь...

А на счет ана....го использования переменной - не согласен!
поскольку для решения определенных задач иногда необходимы и не рациональные решения!
zltigo
QUOTE (Lexy_one @ Jul 5 2011, 13:46) *
А на счет ана....го использования переменной - не согласен!
поскольку для решения определенных задач иногда необходимы и не рациональные решения!

Разумеется нет, так и в Вашем случае следовало четко, ясно, коротко, без всяких
QUOTE
#define _L12_var_lokation_BAT_RAM _L11_var_lokation_BAT_RAM + _Int32U

__no_init Int32U ScArtLoadLastInstAmount @ _L12_var_lokation_BAT_RAM;

#define _L13_var_lokation_BAT_RAM _L12_var_lokation_BAT_RAM + _Int32U
.....

описать структуру данных лежащих в батарейной памяти. При этом не пришлось-бы иметь отдельных разрозненных переменных которые компилятор оптимизировал, могли-бы обойтись только одним фиксированным адресом и что еще правильнее, не использовать задание фиксированных адресов в исходном тексте возложив это на линкер, или что еще проще проинициализировав только указатель на структуру. Причем в последнем случае получили совершенно переносимый и компиляторо-линкеронезависимый исходник. За использование имен типа _L13_var_lokation_BAT_RAM _L12_var_lokation_BAT_RAM + _Int32U вообще надо больно стучать по голове, и отдельно за lokation тех, кто утверждает, что читает "The Dictionary of Standard C" в подлиннике sm.gif.
Lexy_one
В принципе на счет структуры согласен возможно будет попроще.... sm.gif
Просто на этапе начала разработки показалось проще сделать так как есть.

lokation - ДА ЛОХАНУЛСЯ с кем не бывает.. а дальше ctrl+c ... ctrl+v вот и наплодилось...
AHTOXA
lokation - вполне себе нормальное слово, если на датском sm.gif
sergeeff
Цитата(Lexy_one @ Jul 5 2011, 16:44) *
lokation - ДА ЛОХАНУЛСЯ с кем не бывает.. а дальше ctrl+c ... ctrl+v вот и наплодилось...


Как же надо не любить себя самого, чтобы придумывать такие длиннющие имена и волохать их через всю программу.
Lexy_one
Цитата(sergeeff @ Jul 6 2011, 08:59) *
Как же надо не любить себя самого, чтобы придумывать такие длиннющие имена и волохать их через всю программу.


Это не имена... это разметка памяти... и ни кто их через всю программу не тащит!
ar__systems
Цитата(Lexy_one @ Jul 5 2011, 02:09) *
неужели у вас не было не каких проблемм...

У него сейчас проблемы sm.gif
Velund
QUOTE (Lexy_one @ Jul 7 2011, 15:15) *
Это не имена... это разметка памяти...


Будете чистить регистры - не поцарапайте... wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.