假设我有一个函数指针数组。换句话说,我可能想像这样调用矩阵转置函数,具体取决于我的矩阵是什么 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
我找到了一个相当有用的参考资料,但我确实需要一个示例来了解和应用我的确切用例。
那么,究竟什么是定义函数指针数组的正确方法呢?具体来说,声明部分是怎么写的?
(我意识到这可以使用 typedef 更轻松地完成,但我正在编写代码生成器,并且宁愿不使用 typedef。)