|
|
  |
указатель на ф-ю, корректно ли делаю? |
|
|
|
Mar 1 2015, 18:25
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
объявил прототип Код 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, то сразу ошибка компиляции. Так корректно обращаться с указателями на ф-ии?
|
|
|
|
|
Mar 1 2015, 18:55
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
я пока специально- для интриги- не стал ошибку компилятора показывать. Думал, уже на этом этапе мне здесь скажут, что все не так. Тогда продолжаем разумеется, после структуры создаю объект типа указателя Код 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
|
|
|
|
|
Mar 1 2015, 22:29
|

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

|
Цитата(Метценгерштейн @ Mar 1 2015, 18:55)  я пока специально- для интриги- не стал ошибку компилятора показывать. Думал, уже на этом этапе мне здесь скажут, что все не так. Тогда продолжаем Ошибка либо в невыразимо кривом компиляторе, либо в кривых руках интригана (что более вероятно). Вот такое "компилируется" без всяких проблем. Найдите отличия с вышеприведенным кодом. 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);
|
|
|
|
|
Mar 2 2015, 06:41
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
Цитата(CrimsonPig @ Mar 2 2015, 01:29)  Ошибка либо в невыразимо кривом компиляторе, либо в кривых руках интригана (что более вероятно). Вот такое "компилируется" без всяких проблем. Найдите отличия с вышеприведенным кодом. 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)   компилятор написал, что вы не можете использовать типы объявленные через typedef в "форвардинге". только с объявлением тела функции. ЕМНИП в таком случае получается двойная неизвестность - т.е. мало того что ф-ии нет, так ещё и типы пользовательские. как вариант попробуйте другой стандарт (gnu++11 или c++11) или указать параметры функции. т.е. он в таком виде не видит типы данных uint8_t ?
|
|
|
|
|
Mar 2 2015, 09:26
|

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

|
Цитата(Метценгерштейн @ Mar 2 2015, 06:41)  вижу разницу только в переопределении типов typedef unsigned char uint8_t; typedef unsigned int uint32_t; что и без того нормально компилится со включенным stdint.h Если вы что-то не понимаете, не пытайтесь охватить все и сразу, т.е. реализовать всю идею за один присест. Напишите для начала что-нибудь, что компилится и как-то работает, потом добавьте фичей, указателей на функции итп. Всегда будет возможность откатиться на шаг назад и переосмыслить жизненные позиции, почему код прекратил компилиться и смысл жизни вообще.
|
|
|
|
|
Mar 2 2015, 11:39
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(Метценгерштейн @ Mar 2 2015, 14:14)  Пока что вопрос- мы можем в прототипе ф-ии в с99 не писать какая переменная а аргументе ф-ии? Т.е. только ее тип писать, как у меня в прототипе. Можно. см. ISO/IEC 9899:1999 (E) параграф 6.7.5.3, пункты 6, 19 Но, IMHO, в прототипах это не нужно, их все равно по copy-paste делают обычно. А вот в описании типов указателей на ф-ции, вполне себе полезно, чтобы лишних букв не писать. А проблема у Вас проста, как сибирский валенок. timer_mode_t надо определить ДО его использования в прототипе, а не после.
|
|
|
|
|
Mar 2 2015, 11:46
|

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

|
Цитата(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 }
|
|
|
|
|
Mar 2 2015, 12:14
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

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