Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: C,WinAvr, указатель на функцию(+)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Qwertty
Что то не выходит цветок каменный 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...

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


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

Анатолий.
Qwertty
Цитата(aesok @ Apr 13 2008, 01:56) *
Какая версия WinAVR/GCC?

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

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

pFunc* FuncPtr;

(*FuncPtr)();

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

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

Спасибо, видимо по ночам все же лучше спать smile.gif
Хотя вопрос с разбором ошибок у ГЦЦ все же неясен. Ладно бы работало неправильно....
ReAl
Цитата(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.
Qwertty
Цитата(ReAl @ Apr 13 2008, 10:09) *
А это смотрите свой makefie.

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