関数ポインターの配列の配列があるとしましょう。つまり、行列の 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 は使用したくありません。)