Как сохранить указатель на функцию, которая принимает аргументы в Fsm? - PullRequest
0 голосов
/ 14 сентября 2018

Я хочу реализовать функцию с аргументами в FSM.когда я пытаюсь это сделать, эта ошибка появляется

error: initializer element is not constant
         {(&DriveCenter)(86),50,{stop,right,left,stop}},
 note: (near initialization for 'fsm[0].fun')
 error: initializer element is not constant
{(&DriveRight)(45),50,{stop,right,left,stop}},

Вот код:

void DriveCenter(unsigned long out){
    printf("\ncenter = %d",out);
}

typedef struct  {
    void (*fun)(unsigned long out);
    unsigned long delay;
    unsigned long Next_State[4];
} state ;


state fsm[4] ={
        {(&DriveCenter)(86),50,{stop,right,left,stop}},
        {(&DriveRight)(45),50,{stop,right,left,stop}},
        {(&DriveLeft)(787),50,{stop,right,left,stop}},
        {(&DriveStop)(33),50,{stop,right,left,stop}}
};

1 Ответ

0 голосов
/ 14 сентября 2018

Нельзя установить параметр при инициализации указателя на функцию, параметр должен быть объявлен как другой член struct

typedef struct  {
    void (*fun)(unsigned long);
    unsigned long out;
    unsigned long delay;
    unsigned long Next_State[4];
} state ;

state fsm[4] = {
    {DriveCenter,86,50,{stop,right,left,stop}},
    {DriveRight,45,50,{stop,right,left,stop}},
    {DriveLeft,787,50,{stop,right,left,stop}},
    {DriveStop,33,50,{stop,right,left,stop}}
};

В C11 вы можете использовать анонимные struct s, чтобы уточнить, что эти две переменные работают вместе:

typedef struct  {
    struct {
        void (*fun)(unsigned long);
        unsigned long out;
    };
    unsigned long delay;
    unsigned long Next_State[4];
} state ;

state fsm[4] = {
    {{DriveCenter,86},50,{stop,right,left,stop}},
    {{DriveRight,45},50,{stop,right,left,stop}},
    {{DriveLeft,787},50,{stop,right,left,stop}},
    {{DriveStop,33},50,{stop,right,left,stop}}
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...