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

 
 
 
Reply to this topicStart new topic
> указатель на ф-ю, корректно ли делаю?
Метценгерштейн
сообщение Mar 1 2015, 18:25
Сообщение #1


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

Группа: Свой
Сообщений: 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, то сразу ошибка компиляции.
Так корректно обращаться с указателями на ф-ии?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 1 2015, 18:32
Сообщение #2


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

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



А ошибку компилятора читающие должны угадать? Или покажете?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Mar 1 2015, 18:35
Сообщение #3


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



На мой взгляд, подозрительным выглядит тип:
timer_mode_t
который у вас не определен. Возможно это и сердит компилятор.
А остальное вроде бы написано верно.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Mar 1 2015, 18:55
Сообщение #4


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

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
smalcom
сообщение Mar 1 2015, 20:44
Сообщение #5


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

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



Цитата
специально- для интриги- не стал ошибку компилятора показывать

01.gif

компилятор написал, что вы не можете использовать типы объявленные через typedef в "форвардинге". только с объявлением тела функции.
ЕМНИП в таком случае получается двойная неизвестность - т.е. мало того что ф-ии нет, так ещё и типы пользовательские. как вариант попробуйте
другой стандарт (gnu++11 или c++11) или указать параметры функции.
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Mar 1 2015, 22:29
Сообщение #6


Местный
***

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



Цитата(Метценгерштейн @ 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);

Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Mar 2 2015, 06:41
Сообщение #7


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

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



Цитата(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 ?

Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Mar 2 2015, 09:26
Сообщение #8


Местный
***

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



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


Если вы что-то не понимаете, не пытайтесь охватить все и сразу, т.е. реализовать всю идею за один присест.
Напишите для начала что-нибудь, что компилится и как-то работает, потом добавьте фичей, указателей на функции итп.
Всегда будет возможность откатиться на шаг назад и переосмыслить жизненные позиции, почему код прекратил компилиться и
смысл жизни вообще.
Go to the top of the page
 
+Quote Post
smalcom
сообщение Mar 2 2015, 09:35
Сообщение #9


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

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



С сохранением интриги(без исходников) проблематично искать ошибку далее.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Mar 2 2015, 11:14
Сообщение #10


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

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



до дома доберусь, выложу исходники.
Пока что вопрос- мы можем в прототипе ф-ии в с99 не писать какая переменная а аргументе ф-ии? Т.е. только ее тип писать, как у меня в прототипе. Что-то вылетело. Не помню, как раньше делал.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 2 2015, 11:24
Сообщение #11


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

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



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

По-моему, нельзя. Да и смысла не вижу не писать имена.
Go to the top of the page
 
+Quote Post
SM
сообщение Mar 2 2015, 11:39
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 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 надо определить ДО его использования в прототипе, а не после.
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Mar 2 2015, 11:46
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 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
}



Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Mar 2 2015, 12:14
Сообщение #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 надо определить ДО его использования в прототипе, а не после.

ну да, конечно )
Совсем глаз замылился уже)
Go to the top of the page
 
+Quote Post
SM
сообщение Mar 2 2015, 12:41
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



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

Но ошибки у компилятора - жесть жестяная. Нет бы написал, что тип не определен. А то целую кучу выдал, ни разу не касающуюся сути ошибки...
Go to the top of the page
 
+Quote Post

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

 


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


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