|
Функция, которая возвращает указатель на саму себя, как описАть? |
|
|
|
 |
Ответов
|
Apr 10 2007, 14:18
|
Местный
  
Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017

|
Как возвращать указатель на функцию, которая ничего не возвращает, я знаю. Мне нужно немного другое. Возвращать нужно не ЛЮБОЙ указатель, а именно указатель на функцию, себе подобную. То есть получается как бы рекурсия в объявлении типа. Объясню на примере:
typedef ??????? // здесь обьявляется funcPtrType
extern char RxByte(void); // читает байт из UART
funcPtrType StartFunc(char Abyte) // фукнция обработки данных №1 funcPtrType Rx1Func(char Abyte); // фукнция обработки данных №2 funcPtrType Rx2Func(char Abyte); // фукнция обработки данных №3 funcPtrType EndFunc(char Abyte); // фукнция обработки данных №4
//************************************** // прерывание приема данных по UART //************************************** viod UART_RX(void){ char RxByte; static funcPtrType funcPtr; // хранит указатель на текущую фукнцию обработки принятого байта
RxByte = UDR; if (funcPtr == NULL) funcPtr = &StartFunc;
funcPtr = (*funcPtr)(RxByte); //обрабатываем принятий байт и возвращаем указатель // на функцию, которая будет вызвана в следующий раз
}
//************************************** funcPtrType Rx1Func(char Abyte) { .... // обрабатываем Abyte if (Abyte != 0x01) return &Rx1Func; // при следующеем приеме возвращаемся в эту же функцию else return &EndFunc; // }
//************************************** funcPtrType Rx2Func(char Abyte) { .... // обрабатываем Abyte if (Abyte != 0x01) return &Rx1Func; // при следующеем приеме возвращаемся в эту же функцию else return &EndFunc; // } //************************************** funcPtrType EndFunc(char Abyte) { if (Abyte =='A') return &Rx1Func; if (Abyte == 'B') return &Rx2Func; return NULL; } //************************************** funcPtrType StartFunc(char Abyte) { if (Abyte ==0x01) return &Rx1Func; if (Abyte ==0x02) return &Rx2Func; return NULL; }
Можно, конечно, объявить funcPtr как глобальную, и в фукнциях обработки данных (StartFunc, EndFunc, Rx1Func, Rx2Func) напрямую присваивать ей значения. Но такой подход меня пока не устраивает.
|
|
|
|
|
Apr 10 2007, 15:40
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Александр Куличок @ Apr 10 2007, 13:18)  Возвращать нужно не ЛЮБОЙ указатель, а именно указатель на функцию, Читать я все это не стал, извините, обсуждать архитктуру - тоже. Но "любой" преобразуется в нужный при использовании спокойно: Код void *dummy_func(void) { return( (void *)dummy_func ); }
void main(void) { ((void *(*)(void))dummy_func())();
}
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
Александр Куличок Функция, которая возвращает указатель на саму себя Apr 10 2007, 12:25 shreck Хм...
Интересно, а для чего это нужно, если не сек... Apr 10 2007, 12:44 zltigo Цитата(Александр Куличок @ Apr 10 2007, 11... Apr 10 2007, 12:49 xemul "То бензин, а то дети..." (это я про Дел... Apr 10 2007, 13:15 shreck Цитата(Александр Куличок @ Apr 10 2007, 19... Apr 10 2007, 15:05  Александр Куличок Цитата(shreck @ Apr 10 2007, 15:05) Я бы ... Apr 10 2007, 15:36 rezident Может я не совсем понял сути проблемы, но почему б... Apr 10 2007, 14:50 YemZ typedef void* (*funcPtrType)(char);
т.е. funcPtrT... Apr 10 2007, 15:29 Александр Куличок Цитата(YemZ @ Apr 10 2007, 15:29) typedef... Apr 10 2007, 15:57  Сергей Борщ Цитата(Александр Куличок @ Apr 10 2007, 14... Apr 10 2007, 16:18
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|