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

 
 
> взаимное предопределение в C
megajohn
сообщение Nov 8 2013, 08:48
Сообщение #1


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

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



есть указатель на функцию
и определение структуры, где в качестве поля структуры используется этот указатель на функцию
Код
typedef void(*func_ptr) (void* arg, int len );

typedef struct{
int arg2;
func_ptr func;
}Ttest;

это работает
http://codepad.org/XxLWO05k

но нужно в аргумент вызова функции добавить указатель на структуру, типо

Код
typedef void(*func_ptr) (void* arg, int len, Ttest* src );

typedef struct{
int arg2; // dummy
func_ptr func;
}Ttest;

и компилятор не знает Ttest. Как бы предопределить ? typedef struct Ttest; // типа predefinition не помог
http://codepad.org/NY8QUeim


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
halfdoom
сообщение Nov 8 2013, 08:57
Сообщение #2


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

Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072



Код
struct test;

typedef void(*func_ptr) (void* arg, int len, struct test *src );

Go to the top of the page
 
+Quote Post
megajohn
сообщение Nov 8 2013, 09:03
Сообщение #3


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

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



то есть определить сначала полностью все поля test а потом тоже самое для Ttest ? Это же не спортивно


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
halfdoom
сообщение Nov 8 2013, 09:24
Сообщение #4


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

Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072



Расширим и углубим:

Код
struct test;

typedef void(*func_ptr) (void* arg, int len, struct test *src );

typedef struct test {
    int arg2; // dummy
    func_ptr func;
} Ttest;

Go to the top of the page
 
+Quote Post
XVR
сообщение Nov 8 2013, 09:24
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(megajohn @ Nov 8 2013, 13:03) *
то есть определить сначала полностью все поля test а потом тоже самое для Ttest ?
Нет. Можно сделать так:
Код
typedef void(*func_ptr) (void* arg, int len, struct test* src );

typedef struct test {
int arg2; // dummy
func_ptr func;
}Ttest;

Или даже так -
Код
typedef void(*func_ptr) (void* arg, int len, struct Ttest* src );

typedef struct Ttest {
int arg2; // dummy
func_ptr func;
}Ttest;

Go to the top of the page
 
+Quote Post
megajohn
сообщение Nov 8 2013, 10:23
Сообщение #6


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

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



благодарю halfdoom и XVR, все варианты работают, но остановился на четвертом ( почти что третий, только вот не знаю все ли компиляторы проглотят )
Код
typedef void(*func_ptr) (void* arg, int len, struct Ttest* src );

typedef struct {
int arg2; // dummy
func_ptr func;
}Ttest;


UPD: в CCS 5 сработал только вариант halfdoom


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
XVR
сообщение Nov 8 2013, 10:52
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(megajohn @ Nov 8 2013, 14:23) *
только вот не знаю все ли компиляторы проглотят )
С++ может не проглотить. Добавьте Ttest после typedef struct и перед открывающей фигурной скобкой.

Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 14:50
Рейтинг@Mail.ru


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