2

ODE を解くために GSL ライブラリを使用しようとしていますが、void ポインターの使用に問題があります。

配列の配列を含むはずのパラメーターを送信する必要があります。

double k1[2][4];

に送信されます

gsl_odeiv_system sys = {func, jac, 2, &k1};

これは次のようにfuncjacの両方に渡されます。*params

int func (double t, const double y[], double f[], void *params)

func では、次の方法で k1 を抽出しようとしています。

double k1[2][4];
k1 = *(double[][])params;

また

k1 = (double[][])params;

また...

k1 = *(double *)params;

質問は次のとおりだと思います:1行の解決策はありますか?

4

1 に答える 1

5

このような配列型(多次元配列)にキャストできるとは思えません。配列の最初の要素へのポインターを保持するために、一時変数を宣言する必要がある場合があります。

もちろん、これを機能させるには、行ごとの要素数を指定する必要があります。それ以外の場合、コンパイラは結果の配列内の要素にアクセスする方法を知りません (これx[i][j]は内部で各行の要素数に変換される*(x + i*n + j)ことnを思い出してください)。

いえ

 double x[5][2];

 int main()
 {
     double (*y)[5][2];

     void *z = x;

     y = z;


     /* after you extract the pointer from 'z' you 
        can access the elements using (*y)[][] */
     (*y)[1][1] = 1.0;
 }

ちなみに、&k1配列を関数に渡す場合は使わなくても構いません。配列の名前は、そのアドレス (最初の要素へのポインター) として使用できます。

于 2011-05-12T04:16:45.297 に答える