2013-12-04 4 views
2

Я пытаюсь создать многопотоковый конечный автомат, где каждое состояние возвращает указатель на следующее состояние. У меня есть несколько состояний машины, поэтому следующее состояние из них хранится в массиве, который упорядочен, чтобы называть их циклическим способом. Так что я хотел бы сделать, это:Функция возвращает указатель на функцию, возвращающую указатель на функцию

pState[i] = (pState[i])(); 

Я понимаю, как вернуть указатель на функцию в целом, но так как мне нужно возвращаемый указатель будет тип функции, которая возвращает указатель на функцию рекурсии путает меня. Состояние будет выглядеть так:

pSatateFunc StateA(void){ 
// ... code ... 
return StateB; 
} 

Итак, как я могу определить это, чтобы определить массив указателей?

+0

Я знаю, что это было задано раньше, но я не могу найти вопрос. Но короткий ответ - нет, вы не можете рекурсивно определять указатели на функции. Но есть обходные пути (простейшее бытие, функция возвращает void *, который отбрасывается на указатель функции) –

+0

Спасибо, я как бы думал об этом, но думал, что я чего-то не хватает. – rrritchey

ответ

1

Вы не можете сделать это прямо, но вы можете сделать это косвенно путем введения struct типа которого только член указатель функции:

struct state 
{ 
    struct state (*func)(void); 
}; 

Тогда ваши функции определены для возврата этого типа:

struct state StateA(void) 
{ 
    /* ... code ... */ 
    return (struct state){ StateB }; 
} 

Ваш pstate массив будет этого типа тоже:

struct state pState[N]; 

/* ... */ 

pState[i] = pState[i].func(); 
+0

Smart. Мне это нравится. –

Смежные вопросы