1

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

4

3 に答える 3

3

使用方法と同様の方法で宣言します。たとえば、次のようになります。

void (*Transp[DTYPES_MAX][INDEX_TYPES_MAX])(const int64_t*,
                                            const int64_t*,
                                            const int64_t*,
                                            const int64_t*);
于 2012-06-15T21:13:00.120 に答える
2

したがって、関数ポインタの型は

ReturnType (*)(Args);

関数ポインタの配列の型は

ReturnType (*[n])(Args);

したがって、関数ポインタの配列の配列は次のようになります

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

これをあなたが持っているものと比較すると、配列を次のように宣言しているように見えます

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

つまり、配列の配列を返す関数へのポインターへのポインターです。変数宣言から星の 1 つを削除し、配列を括弧内に移動すると、問題が解決すると思います。

お役に立てれば!

于 2012-06-15T21:11:47.250 に答える
0

すべての関数ポインターに固定数のパラメーターがあるが、パラメーターの数またはパラメーターの型が異なる場合、単一の型の関数ポインターを移植可能に使用してすべての関数ポインターを表すことはできません。

void *POSIXシステムでは、POSIXが関数ポインタの表現を保証し、同じであるため、配列の配列を使用できますvoid *。Cでは実際には関数ポインタ間の変換はありませんvoid *が、コンパイラは通常それをサポートしています.

于 2012-06-15T21:20:03.477 に答える