假设我有一组函数指针数组。换句话说,我可能想要调用矩阵转置函数,这取决于我的矩阵是什么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。)
答案 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 *
之间没有转换,但编译器通常支持它。