указатели на функции внутри структуры, но с функциями другого прототипа в C - PullRequest
5 голосов
/ 02 марта 2012

Предположим, у меня есть функции:

void func1(int x)
{
    ....
}

void func2(int x, int y)
{
    ....
}

void func3(int x, int y, int z)
{
    ....
}

и говорят, что я хочу иметь указатель на функцию в структуре:

Например,

typedef struct{
     char *ename;
     char **pname;
    < and here I want to have a function pointer> ??
} Example;

Example ex[3];

Теперь,Я хочу заполнить массив ex [3] следующим образом:

ex[0].ename = "X0";
ex[0].pname[0]="A0";
ex[0].pname[1]="B0";
ex[0].<function pointer to func1() > ??


ex[1].ename = "X1";
ex[1].pname[0]="A1";
ex[1].pname[1]="B1";
ex[1].<function pointer to func2() > ??

... и так далее ...

Возможно ли создать что-то подобное?Пожалуйста, помогите мне с этим.Спасибо.

Ответы [ 2 ]

7 голосов
/ 02 марта 2012

Я бы использовал union функциональных указателей:

union {
    void (*fun1)(int);
    void (*fun2)(int, int);
} fptr;

Вам также необходимо поле в структуре, чтобы указать, какое из них используется.

2 голосов
/ 02 марта 2012

У вас есть два варианта - небрежный, но легкий, или точный, но кропотливый.

Слоппи

typedef struct{
     char *ename;
     char *pname[3];
     void (*function)();   // Pointer to function taking indeterminate arguments
} Example;

Example ex[3] =
{
    { "func1", { "x",           }, func1 },
    { "func2", { "x", "y",      }, func2 },
    { "func3", { "x", "y", "z", }, func3 },
};

Это не проходит, если вы компилируете с -Wstrict-prototypes в GCC. Обратите внимание, что я позаботился о том, чтобы было место для имен параметров - у вашего оригинала было char **pname, что означало бы, что вы должны выделить хранилище для массивов, прежде чем присваивать им имена.

1010 * кропотливая * typedef struct{ char *ename; char *pname[3]; union { void (*f1)(int x); void (*f2)(int x, int y); void (*f3)(int x, int y, int z); } u; } Example; Example ex[3] = { { "func1", { "x", }, .u.f1 = func1 }, { "func2", { "x", "y", }, .u.f2 = func2 }, { "func3", { "x", "y", "z", }, .u.f3 = func3 }, }; При инициализации используются обозначенные C99 инициализаторы. Каждому указателю функции присваивается правильно типизированный элемент объединения.

...