Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: указатель на ф-ю
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Метценгерштейн
объявил прототип
Код
typedef void (*timer_callback_t)(uint8_t);


теперь в структуре создаю переменную этого типа
Код
typedef struct  
{
...
...
    timer_callback_t     callback;
} timer_struct_t;


вот сама ф-я, в которую передается как параметр адрес другой ф-ии
Код
uint8_t timer_create(timer_mode_t _mode, uint32_t _time, timer_callback_t _callback)
{

}


пока не ругается компилятор.

А вот когда создаю прототип ф-ии timer_create, то сразу ошибка компиляции.
Так корректно обращаться с указателями на ф-ии?
ViKo
А ошибку компилятора читающие должны угадать? Или покажете?
Xenia
На мой взгляд, подозрительным выглядит тип:
timer_mode_t
который у вас не определен. Возможно это и сердит компилятор.
А остальное вроде бы написано верно.
Метценгерштейн
я пока специально- для интриги- не стал ошибку компилятора показывать. Думал, уже на этом этапе мне здесь скажут, что все не так.
Тогда продолжаем

разумеется, после структуры создаю объект типа указателя
Код
static timer_struct_t   timer[10];


тип timer_mode_t определен сразу перед структурой. Простой enum

создаю прототип
Код
typedef void (*timer_callback_t)(uint8_t);


//static timer_callback_t    callback    = 0;
uint8_t timer_create(timer_mode_t, uint32_t, timer_callback_t);


получаю кучу ошибок
http://c2n.me/3dojOWV
smalcom
Цитата
специально- для интриги- не стал ошибку компилятора показывать

01.gif

компилятор написал, что вы не можете использовать типы объявленные через typedef в "форвардинге". только с объявлением тела функции.
ЕМНИП в таком случае получается двойная неизвестность - т.е. мало того что ф-ии нет, так ещё и типы пользовательские. как вариант попробуйте
другой стандарт (gnu++11 или c++11) или указать параметры функции.
CrimsonPig
Цитата(Метценгерштейн @ Mar 1 2015, 18:55) *
я пока специально- для интриги- не стал ошибку компилятора показывать. Думал, уже на этом этапе мне здесь скажут, что все не так.
Тогда продолжаем


cranky.gif
Ошибка либо в невыразимо кривом компиляторе, либо в кривых руках интригана (что более вероятно).

Вот такое "компилируется" без всяких проблем. Найдите отличия с вышеприведенным кодом.

typedef unsigned char uint8_t;
typedef unsigned int uint32_t;
typedef void (*timer_callback_t)(uint8_t);
uint8_t timer_create(uint32_t, uint32_t, timer_callback_t);

Метценгерштейн
Цитата(CrimsonPig @ Mar 2 2015, 01:29) *
cranky.gif
Ошибка либо в невыразимо кривом компиляторе, либо в кривых руках интригана (что более вероятно).

Вот такое "компилируется" без всяких проблем. Найдите отличия с вышеприведенным кодом.

typedef unsigned char uint8_t;
typedef unsigned int uint32_t;
typedef void (*timer_callback_t)(uint8_t);
uint8_t timer_create(uint32_t, uint32_t, timer_callback_t);


вижу разницу только в переопределении типов
typedef unsigned char uint8_t;
typedef unsigned int uint32_t;

что и без того нормально компилится со включенным stdint.h



Цитата(smalcom @ Mar 1 2015, 23:44) *
01.gif

компилятор написал, что вы не можете использовать типы объявленные через typedef в "форвардинге". только с объявлением тела функции.
ЕМНИП в таком случае получается двойная неизвестность - т.е. мало того что ф-ии нет, так ещё и типы пользовательские. как вариант попробуйте
другой стандарт (gnu++11 или c++11) или указать параметры функции.


т.е. он в таком виде не видит типы данных uint8_t ?

CrimsonPig
Цитата(Метценгерштейн @ Mar 2 2015, 06:41) *
вижу разницу только в переопределении типов
typedef unsigned char uint8_t;
typedef unsigned int uint32_t;
что и без того нормально компилится со включенным stdint.h


Если вы что-то не понимаете, не пытайтесь охватить все и сразу, т.е. реализовать всю идею за один присест.
Напишите для начала что-нибудь, что компилится и как-то работает, потом добавьте фичей, указателей на функции итп.
Всегда будет возможность откатиться на шаг назад и переосмыслить жизненные позиции, почему код прекратил компилиться и
смысл жизни вообще.
smalcom
С сохранением интриги(без исходников) проблематично искать ошибку далее.
Метценгерштейн
до дома доберусь, выложу исходники.
Пока что вопрос- мы можем в прототипе ф-ии в с99 не писать какая переменная а аргументе ф-ии? Т.е. только ее тип писать, как у меня в прототипе. Что-то вылетело. Не помню, как раньше делал.
ViKo
Цитата(Метценгерштейн @ Mar 2 2015, 14:14) *
Пока что вопрос- мы можем в прототипе ф-ии в с99 не писать какая переменная а аргументе ф-ии? Т.е. только ее тип писать, как у меня в прототипе. Что-то вылетело. Не помню, как раньше делал.

По-моему, нельзя. Да и смысла не вижу не писать имена.
SM
Цитата(Метценгерштейн @ Mar 2 2015, 14:14) *
Пока что вопрос- мы можем в прототипе ф-ии в с99 не писать какая переменная а аргументе ф-ии? Т.е. только ее тип писать, как у меня в прототипе.


Можно. см. ISO/IEC 9899:1999 (E) параграф 6.7.5.3, пункты 6, 19
Но, IMHO, в прототипах это не нужно, их все равно по copy-paste делают обычно. А вот в описании типов указателей на ф-ции, вполне себе полезно, чтобы лишних букв не писать.

А проблема у Вас проста, как сибирский валенок. timer_mode_t надо определить ДО его использования в прототипе, а не после.
CrimsonPig
Цитата(ViKo @ Mar 2 2015, 11:24) *
По-моему, нельзя. Да и смысла не вижу не писать имена.


...а суслик-то есть!
например:

//-- declaration:
int Foo(const void*, int, int); //-- смысла не много в экономии на именах параметров

//int Foo(const void* a, int b, int c); так тоже сгодится

//-- definition:
int Foo(const void* apSomething, int aParam1, int /*aParam2*/)
{ //-- aParam2 in not used, suppress compiler warning
}



Метценгерштейн
Цитата(SM @ Mar 2 2015, 14:39) *
Можно. см. ISO/IEC 9899:1999 (E) параграф 6.7.5.3, пункты 6, 19
Но, IMHO, в прототипах это не нужно, их все равно по copy-paste делают обычно. А вот в описании типов указателей на ф-ции, вполне себе полезно, чтобы лишних букв не писать.

А проблема у Вас проста, как сибирский валенок. timer_mode_t надо определить ДО его использования в прототипе, а не после.

ну да, конечно )
Совсем глаз замылился уже)
SM
Цитата(Метценгерштейн @ Mar 2 2015, 15:14) *
Совсем глаз замылился уже)

Но ошибки у компилятора - жесть жестяная. Нет бы написал, что тип не определен. А то целую кучу выдал, ни разу не касающуюся сути ошибки...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.