массивы, указатели и указатели на функции в конечном автомате - PullRequest
1 голос
/ 09 марта 2012

Я читал это: http://johnsantic.com/comp/state.html и с трудом понимал эту часть:

void (*const state_table [MAX_STATES][MAX_EVENTS]) (void) = {

    { action_s1_e1, action_s1_e2 }, /* procedures for state 1 */
    { action_s2_e1, action_s2_e2 }, /* procedures for state 2 */
    { action_s3_e1, action_s3_e2 }  /* procedures for state 3 */
};

Может кто-нибудь объяснить, что здесь происходит?

Ответы [ 2 ]

4 голосов
/ 09 марта 2012

Определяет двумерный массив функций-указателей (return void).

state_table [MAX_STATES][MAX_EVENTS] означает, что state_table является 2D-массивом, а void (*expression)(void) означает, что expression является указателем на функцию, которая не принимает аргументов (это среднее значение (void) в качестве списка аргументов), и возвращает void.

Остальные строки просто инициализируют массив.

1 голос
/ 09 марта 2012

Если вы не используете код с помощью typedef, он становится читабельным:

typedef void (*const fptr_state) (void);

fptr_state  state_table [MAX_STATES][MAX_EVENTS] = 
{
    { action_s1_e1, action_s1_e2 }, /* procedures for state 1 */
    { action_s2_e1, action_s2_e2 }, /* procedures for state 2 */
    { action_s3_e1, action_s3_e2 }  /* procedures for state 3 */
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...