Метценгерштейн 0 22 июня, 2015 Опубликовано 22 июня, 2015 · Жалоба Keil, ARM создаю ф-ю inline void lowPowerHeat (void) { fSinglePower = 1; fDowblePower =0; } где присваиваю двум глобальным переменным значения. Дальше по коду вызываю эту ф-ю. Но выдает ошибку .\_build\v1_0_alpha.axf: Error: L6218E: Undefined symbol lowPowerHeat (referred from logic_work.o). стоит только или: 1 -убрать inline или 2- дописать static или 3- закомментировать любую переменную внутри ф-ии или 4- внутри тела файла один из двух (любой) вызов ф-ии закомментить, то ошибка пропадает. А почему так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lotor 0 22 июня, 2015 Опубликовано 22 июня, 2015 · Жалоба Подозреваю, что Вам стоит убрать инлайновую функцию в h-файл. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 22 июня, 2015 Опубликовано 22 июня, 2015 · Жалоба а почему? Она в .c находится. Разве так нельзя? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harvester 0 22 июня, 2015 Опубликовано 22 июня, 2015 · Жалоба Насколько я понимаю, inline-функция просто по-определению должна быть static. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 22 июня, 2015 Опубликовано 22 июня, 2015 · Жалоба Насколько я понимаю, inline-функция просто по-определению должна быть static. Вы таки понимаете неправильно. inline и static понятия ортогональные. P.S. Компилятор должен видеть всю inline функцию целиком. Поэтому если она используется в нескольких модулях, то обычно целиком включается в заголовочный файл. Если она используется только в одном модуле, то можно ее текст включить только в исходник этого модуля. В последнем случае static не помешает но и не поможет сильно. И вообще это все в любом букваре описано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 22 июня, 2015 Опубликовано 22 июня, 2015 · Жалоба понятно, что статик- это область видимости только. Никак на решение проблемы не должно влиять. Но в чем причина такого поведения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 22 июня, 2015 Опубликовано 22 июня, 2015 · Жалоба Да вроде даже интуитивно понятно - чтобы подставить вызов функции, надо знать только имя и список параметров. А чтобы подставить саму функцию - надо знать всю функцию целиком. В первом случае достаточно объявления, во втором - необходимо определение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 22 июня, 2015 Опубликовано 22 июня, 2015 · Жалоба Да вроде даже интуитивно понятно - чтобы подставить вызов функции, надо знать только имя и список параметров. А чтобы подставить саму функцию - надо знать всю функцию целиком. В первом случае достаточно объявления, во втором - необходимо определение. и как это мне поможет? Не совсем просто понятно. Что у меня не так с определением ф-ии? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 23 июня, 2015 Опубликовано 23 июня, 2015 · Жалоба Что у меня не так с определением ф-ии? Не так у Вас то, что Вы тут ищете телепатов, коих тут нету. Если бы действительно хотели совета, описали-бы подробно: в каком файле определена функция? в каких вызывается? какой язык? каковы опции оптимизации (в частности всё что касается inlining)? как определены переменные, которые записываете внутри функции? ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 23 июня, 2015 Опубликовано 23 июня, 2015 · Жалоба и как это мне поможет? Не совсем просто понятно. Что у меня не так с определением ф-ии? Дело в том, что в си используется раздельная компиляция. То есть, каждый *.c файл компилируется отдельно от других. Теперь смотрите: вы поместили объявление инлайн-функции в файл inline.h: inline int myInlineFunction(); , а определение инлайн-функции в файл inline.cpp: inline int myInlineFunction(){ return 42; } Теперь вы хотите использовать эту функцию в файле main.c. Вы пишете: #include "inline.h" void main() { i = myInlineFunction(); } Компилятор компилирует файл main.c. Напомню, компиляция раздельная, то есть, компилятор видит только текущую единицу компиляции. Он видит main.c, он видит включаемый файл inline.h, но не видит файла inline.c. Он хочет подставить встраиваемую функцию, но не видит её тела, а видит только её объявление, расположенное в файле inline.h. Вот и получается ошибка. Поэтому для встраиваемых функций приходится помещать определение функции в *.h файл. Файл inline.h: inline int myInlineFunction(){ return 42; } Теперь компиляция main.c пройдёт нормально. Но если мы захотим использовать эту функцию в ещё одном файле, скажем, foo.c, то на этапе линковки возникнет ошибка, потому что модули main и foo будут содержать функцию myInlineFunction(). Для решения этой проблемы надо сделать myInlineFunction() статической: static inline int myInlineFunction(){ return 42; } Вот теперь всё будет нормально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
halfdoom 0 23 июня, 2015 Опубликовано 23 июня, 2015 · Жалоба ошибка пропадает. А почему так? Если файл logic_work.с содержит определение вышеназванной функции (не путать с объявлением), то это явный баг в компиляторе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 23 июня, 2015 Опубликовано 23 июня, 2015 · Жалоба Если файл logic_work.с содержит определение вышеназванной функции (не путать с объявлением), то это явный баг в компиляторе. Не думаю. Скорей всего ТС что-то недоговаривает. Я уже написал об этом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 23 июня, 2015 Опубликовано 23 июня, 2015 · Жалоба Всем привет. Попробуем еще раз сначала. Допускаю, что не все подробно изложил. То, что ф-я должна быть в .h- это я уже понял. Спасибо за подробное объяснение. Но тут вот как происходит: сама ф-я - ее тело- описано в файле, в котором я и вызываю ее. Никаких .h пока нет. Есть один файл, где и сама ф-я и ее вызов ниже. Т.е. прототип не нужен. void lowPowerHeat (void) { fSinglePower = 1; fDowblePower = 0; } так нет ошибки inline void lowPowerHeat (void) { fSinglePower = 1; fDowblePower = 0; } так сразу ошибки Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 23 июня, 2015 Опубликовано 23 июня, 2015 · Жалоба Может, компилятор выбросил ненужную переменную? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 23 июня, 2015 Опубликовано 23 июня, 2015 · Жалоба Может, компилятор выбросил ненужную переменную? Компилятор выкинул ненужную функцию :) Что, собственно и правильно. TC, делайте-ка полный поиск по имени вашей функции во всех файлах вашего проекта. Может вы где-то забыли ссылку на нее. Если не поможет - выкиньте компилятор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться