реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> ф-я инлайн, не хочет компилится
Метценгерштейн
сообщение Jun 22 2015, 11:26
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



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- внутри тела файла один из двух (любой) вызов ф-ии закомментить, то

ошибка пропадает.
А почему так?
Go to the top of the page
 
+Quote Post
Lotor
сообщение Jun 22 2015, 11:34
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Подозреваю, что Вам стоит убрать инлайновую функцию в h-файл.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jun 22 2015, 12:16
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



а почему? Она в .c находится. Разве так нельзя?
Go to the top of the page
 
+Quote Post
Harvester
сообщение Jun 22 2015, 13:42
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Насколько я понимаю, inline-функция просто по-определению должна быть static.


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Jun 22 2015, 15:11
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(Harvester @ Jun 22 2015, 14:42) *
Насколько я понимаю, inline-функция просто по-определению должна быть static.


Вы таки понимаете неправильно. inline и static понятия ортогональные.
P.S. Компилятор должен видеть всю inline функцию целиком. Поэтому если она используется в нескольких модулях, то обычно целиком включается в заголовочный файл. Если она используется только в одном модуле, то можно ее текст включить только в исходник этого модуля. В последнем случае static не помешает но и не поможет сильно.
И вообще это все в любом букваре описано.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jun 22 2015, 17:24
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



понятно, что статик- это область видимости только. Никак на решение проблемы не должно влиять.
Но в чем причина такого поведения?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 22 2015, 18:45
Сообщение #7


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Да вроде даже интуитивно понятно - чтобы подставить вызов функции, надо знать только имя и список параметров. А чтобы подставить саму функцию - надо знать всю функцию целиком.
В первом случае достаточно объявления, во втором - необходимо определение.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jun 22 2015, 19:57
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Цитата(AHTOXA @ Jun 22 2015, 21:45) *
Да вроде даже интуитивно понятно - чтобы подставить вызов функции, надо знать только имя и список параметров. А чтобы подставить саму функцию - надо знать всю функцию целиком.
В первом случае достаточно объявления, во втором - необходимо определение.

и как это мне поможет? Не совсем просто понятно.
Что у меня не так с определением ф-ии?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 23 2015, 02:59
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Метценгерштейн @ Jun 23 2015, 01:57) *
Что у меня не так с определением ф-ии?

Не так у Вас то, что Вы тут ищете телепатов, коих тут нету. Если бы действительно хотели совета, описали-бы подробно:
в каком файле определена функция? в каких вызывается? какой язык? каковы опции оптимизации (в частности всё что касается inlining)? как определены переменные, которые записываете внутри функции? ...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 23 2015, 04:45
Сообщение #10


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Метценгерштейн @ Jun 23 2015, 00:57) *
и как это мне поможет? Не совсем просто понятно.
Что у меня не так с определением ф-ии?

Дело в том, что в си используется раздельная компиляция. То есть, каждый *.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;
}

Вот теперь всё будет нормально.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
halfdoom
сообщение Jun 23 2015, 04:51
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072



Цитата(Метценгерштейн @ Jun 22 2015, 14:26) *
ошибка пропадает.
А почему так?

Если файл logic_work.с содержит определение вышеназванной функции (не путать с объявлением), то это явный баг в компиляторе.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 23 2015, 05:22
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(halfdoom @ Jun 23 2015, 10:51) *
Если файл logic_work.с содержит определение вышеназванной функции (не путать с объявлением), то это явный баг в компиляторе.

Не думаю. Скорей всего ТС что-то недоговаривает. Я уже написал об этом.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jun 23 2015, 06:10
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Всем привет. Попробуем еще раз сначала. Допускаю, что не все подробно изложил.
То, что ф-я должна быть в .h- это я уже понял. Спасибо за подробное объяснение.
Но тут вот как происходит:
сама ф-я - ее тело- описано в файле, в котором я и вызываю ее. Никаких .h пока нет.
Есть один файл, где и сама ф-я и ее вызов ниже. Т.е. прототип не нужен.
Код
void lowPowerHeat (void)
{    
    fSinglePower = 1;
    fDowblePower = 0;
}

так нет ошибки

Код
inline void lowPowerHeat (void)
{    
    fSinglePower = 1;
    fDowblePower = 0;
}

так сразу ошибки
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 23 2015, 06:45
Сообщение #14


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Может, компилятор выбросил ненужную переменную?
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Jun 23 2015, 07:47
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(ViKo @ Jun 23 2015, 07:45) *
Может, компилятор выбросил ненужную переменную?


Компилятор выкинул ненужную функцию sm.gif Что, собственно и правильно.

TC, делайте-ка полный поиск по имени вашей функции во всех файлах вашего проекта. Может вы где-то забыли ссылку на нее.
Если не поможет - выкиньте компилятор.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 07:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01433 секунд с 7
ELECTRONIX ©2004-2016