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

 
 
 
Reply to this topicStart new topic
> C,WinAvr, указатель на функцию(+)
Qwertty
сообщение Apr 12 2008, 21:31
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Что то не выходит цветок каменный sad.gif

Код
// test.h
#ifndef    _TEST_H_
#define    _TEST_H_

#include    <inttypes.h>

enum    enButtons { btNone, btUp, btDown, btLeft, btRight, btEnter, btExit };
typedef void (*DispFuncPtr)(enum enButtons btn);

extern    DispFuncPtr*    DispFunc;

extern    void TestFunc1(enum enButtons btn);
extern    void TestFunc2(enum enButtons btn);

#endif


Код
//test.c
#include    "test.h"

DispFuncPtr*    DispFunc = (void*)0;

void TestFunc1(enum enButtons _btn)
{

}

void TestFunc2(enum enButtons _btn)
{

}

Код
//main.c
#include    <inttypes.h>
#include    "test.h"


int    main(void)
{
enum    enButtons x;
DispFunc = (DispFuncPtr*)&TestFunc1;

x = btUp;
(*DispFunc)(x);

while(1){};
}

Результат:
Код
Build started 13.4.2008 at 01:31:32
avr-gcc.exe  -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=4000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT test.o -MF dep/test.o.d  -c  ../test.c
avr-gcc.exe  -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=4000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
C:\DOCUME~1\Pawel\LOCALS~1\Temp/ccKMaaaa.s: Assembler messages:
C:\DOCUME~1\Pawel\LOCALS~1\Temp/ccKMaaaa.s:35: Error: garbage at end of line
C:\DOCUME~1\Pawel\LOCALS~1\Temp/ccKMaaaa.s:36: Error: missing ')'
C:\DOCUME~1\Pawel\LOCALS~1\Temp/ccKMaaaa.s:36: Error: garbage at end of line
make: *** [main.o] Error 1
Build succeeded with 0 Warnings...

Раньше что то типа этого проходило. Что у меня не так?
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 12 2008, 21:56
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Qwertty @ Apr 13 2008, 00:31) *
Раньше что то типа этого проходило. Что у меня не так?


Какая версия WinAVR/GCC?

Анатолий.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Apr 12 2008, 22:00
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(aesok @ Apr 13 2008, 01:56) *
Какая версия WinAVR/GCC?

20060421
Если закоментировать в main.c (*DispFunc)(x); то все нормально, указателю присваивается адрес правильный. Только вызов не проходит...
Вообще выход удивил - 1 ошибка и сборка прошла успешно, без варнингов smile.gif

Сообщение отредактировал Qwertty - Apr 12 2008, 22:03
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 12 2008, 23:06
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Qwertty @ Apr 13 2008, 01:00) *
20060421
Если закоментировать в main.c (*DispFunc)(x); то все нормально, указателю присваивается адрес правильный. Только вызов не проходит...
Вообще выход удивил - 1 ошибка и сборка прошла успешно, без варнингов smile.gif


Компилятор генерирует код, который ассемблер не понимает.

Анатолий.

В вашем примере DispFunc это указатель на указатель на функцию, а должен быть указатель на функцию.

Привильно так:
Код
typedef void (*DispFuncPtr)(void);
...
extern    DispFuncPtr    DispFunc;
...
DispFunc = TestFunc2;
...
(*DispFunc)();

Анатолий.

Сообщение отредактировал aesok - Apr 12 2008, 23:57
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Apr 13 2008, 00:17
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Заменил перечислимый тип на кучку дефайнов, ничего не изменилось... sad.gif
С функциями без параметров все работает, то есть конструкция типа:
Код
void  (*pFunc)(void);

pFunc* FuncPtr;

(*FuncPtr)();

проходит без всяких странностей.

Цитата(aesok @ Apr 13 2008, 03:06) *
В вашем примере DispFunc это указатель на указатель на функцию, а должен быть указатель на функцию.

Спасибо, видимо по ночам все же лучше спать smile.gif
Хотя вопрос с разбором ошибок у ГЦЦ все же неясен. Ладно бы работало неправильно....

Сообщение отредактировал Qwertty - Apr 12 2008, 23:42
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 13 2008, 06:09
Сообщение #6


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Qwertty @ Apr 13 2008, 00:31) *
Код
...
C:\DOCUME~1\Pawel\LOCALS~1\Temp/ccKMaaaa.s:36: Error: garbage at end of line
make: *** [main.o] Error 1
Build succeeded with 0 Warnings...

Цитата(Qwertty @ Apr 13 2008, 01:00) *
Вообще выход удивил - 1 ошибка и сборка прошла успешно, без варнингов smile.gif
А это смотрите свой makefie.
Сообщение "Build succeeded with 0 Warnings..." прошло уже после того, как avr-gcc наругался всласть, вернул make код ошибки 1, make про эту ошибку сказал и пошёл отрабатывать остальные команды из makefile.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Apr 13 2008, 21:04
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(ReAl @ Apr 13 2008, 10:09) *
А это смотрите свой makefie.

Этот makefie сгенерировала студия. Экспортировал я его, смотрю, криминала не вижу. Какая секция может вызвать такое поведение?
Почему все не так... Вроде все как всегда... smile.gif
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 14 2008, 06:40
Сообщение #8


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Qwertty @ Apr 14 2008, 00:04) *
Этот makefie сгенерировала студия. Экспортировал я его, смотрю, криминала не вижу. Какая секция может вызвать такое поведение?
Присоедините makefile, гляну.
А может эт сама студия от себя что-то добавляет? Из неё запускаете или автономно?
Если запускали из студии - попробуйте в каком-нибудь FAR-е или в "командной строке" ("DOS-prompt") в каталоге с makefile запустить вручную make - такие же сообщения?


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 17th June 2025 - 15:23
Рейтинг@Mail.ru


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