定义函数指针数组的正确方法是什么?

时间:2012-06-15 21:05:14

标签: c arrays function-pointers

假设我有一组函数指针数组。换句话说,我可能想要调用矩阵转置函数,这取决于我的矩阵是什么dtype:

Transp[dtype][index_dtype](A.ia, A.a, B.ia, B.a);

Transp中的功能可能如下所示:

void transp_i64_i8(const int64_t* ia, const int8_t* a, int64_t* ib, int8_t* b) {
  // transpose here
  return;
}

除了改变指针类型。

在我看来,我应该像这样声明我的函数指针数组:

void (**Transp)(const void* ia, const void* a, const void* ib, const void* b)[DTYPES_MAX][INDEX_TYPES_MAX] = {
  {transp_i8_i8, transp_i8_i16, transp_i8_i32, /* ... */ },
  {transp_i16_i8, transp_i16_i16, /* ... */ },
  {transp_i32_i8, transp_i32_i16, /* ... */ },
  /* ... */
}

不幸的是,这似乎不起作用:

error: called object ‘Transp[(int)self_m->storage->dtype][(int)((struct YALE_STORAGE *)self_m->storage)->index_dtype]’ is not a function
../../../../ext/nmatrix/nmatrix.c: In function ‘nm_complex_conjugate_bang’:
../../../../ext/nmatrix/nmatrix.c:1910:32: error: subscripted value is neither array nor pointer nor vector

我找到one fairly useful reference,但我确实需要一个示例来说明我的确切用例才能理解和应用。

那么,确切地说,定义函数指针数组的正确方法是什么?具体来说,如何写出声明部分?

(我意识到这可以通过typedef更容易完成,但我正在编写代码生成器,而不想使用typedef。)

3 个答案:

答案 0 :(得分:3)

您以与使用它的方式类似的方式声明它,例如:

void (*Transp[DTYPES_MAX][INDEX_TYPES_MAX])(const int64_t*,
                                            const int64_t*,
                                            const int64_t*,
                                            const int64_t*);

答案 1 :(得分:2)

所以函数指针的类型是

ReturnType (*)(Args);

函数指针数组的类型是

ReturnType (*[n])(Args);

因此,函数指针数组的数组将是

ReturnType (*[n][m])(Args);

将此与您所拥有的相比,看起来您将阵列声明为

ReturnType (**)(Args)[n][m];

即指向指向返回数组数组的函数的指针。如果从变量声明中删除其中一颗星并将数组移到括号内,我认为这样可以解决问题。

希望这有帮助!

答案 2 :(得分:0)

如果函数指针都有固定数量的参数但参数数量不同或参数类型不同,那么无论如何都不能使用单一类型的函数指针来表示所有函数指针。

在POSIX系统中,您可以使用void *数组的数组,因为POSIX保证函数指针的表示,void *是相同的。实际上,在函数指针和void *之间没有转换,但编译器通常支持它。