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

 
 
> Функция, которая возвращает указатель на саму себя, как описАть?
Александр Куличо...
сообщение Apr 10 2007, 12:25
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Как в С описать функцию, которая возвращает указатель на функцию, себе подобную (на саму себя)?

В Делфи, например, можно сначала описАть указатель на тип, а потом описать уже сам тип:
type
PFunc = ^TFunc;
TFunc = function(X: Integer): PFunc;

Позволяет ли подобное С и как это реализуется?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Александр Куличо...
сообщение Apr 10 2007, 14:18
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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) напрямую присваивать ей значения. Но такой подход меня пока не устраивает.
Go to the top of the page
 
+Quote Post
shreck
сообщение Apr 10 2007, 15:05
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328



Цитата(Александр Куличок @ Apr 10 2007, 19:18) *
Как возвращать указатель на функцию, которая ничего не возвращает, я знаю.
Мне нужно немного другое. Возвращать нужно не ЛЮБОЙ указатель, а именно указатель на функцию,
себе подобную. То есть получается как бы рекурсия в объявлении типа.
Объясню на примере:

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

...



Я бы рекомендовал пересмотреть дизайн этой части программы. Слишком уж он хитромудрый.
Но если не хочется, то может быть использовать массив указателей на функцию возвращающую, скажем uint8, который будет являтся индексом в массиве указателей. Приведенный код практически не изменится.
Go to the top of the page
 
+Quote Post



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

 


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


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