-1

私はこれで本当に対立しています。次のように、C で 3 次元配列を作成しています。

double maxEval = 0;        
double Evals[2][le-1];  
double Waves[2][2][le-1];

for(int i=0; i<le-1; i++){

  getEvalsandWaves(&Evals[0][i], &Evals[1][i], &Waves[0][0][i], &Waves[0][1][i],
                   &Waves[1][0][i], &Waves[1][1][i], g, dx, &maxEval,
                   Q[0][i], Q[0][i+1], Q[1][i], Q[1][i+1]);

  if(myRank==0){
    printf("i= %d, %f  %f\n",i,Waves[0][0][i],Waves[0][1][i]);
    printf("       %f  %f\n\n",Waves[1][0][i],Waves[1][1][i]);
  }
}

getEvalsandWaves のプロト関数と関数は次のとおりです。

/*The objective of this function is to calculate eigenvalues which have a close*/
/*form (e1 and e2) as well as the wave speeds associated with each eigenvalue  */
/*[w00; w10]) and [w01;w11] which then are stored in a thee dimensional matrix */

void getEvalsandWaves(double *e1, double *e2, double *w00,double *w01, double *w10,
                      double *w11, double g,double dx, double *max, double him, 
                      double hi, double uim, double ui);

void getEvalsandWaves(double *e1, double *e2, double *w00, double *w01, double *w10, 
                      double *w11, double g, double dx, double *max, double him, 
                      double hi, double uim, double ui){

                      double hbar=0; double ubar=0;

                      /*this function only returns the Roe averages */
                      /*using the values him,hi,uim,ui which are all*/
                      /*doubles */
                      RoeAvg(&hbar, &ubar,him,hi,uim,ui);

                      (*e1) = ubar - sqrt(g*hbar);
                      (*e2) = ubar + sqrt(g*hbar);

                      /*I tried to use this values instead of (*e1) and (*e2)*/
                      /*in calculating the w'sbelow to see if it fixed the   */
                      /*problem but it didn't work.                          */
                      double ei1 = ubar - sqrt(g*hbar);
                      double ei2 = ubar + sqrt(g*hbar);

                      if(fabs((*e1))>(*max))
                      (*max)=fabs((*e1));

                      if(abs((*e2))>(*max))
                      (*max)=fabs((*e2));

                      double c = 1/(2*sqrt(g*hbar));

                      (*w00) = c * ( ei2*(hi-him)+(ui-uim) ) * 1;      
                      (*w01) = c * ( (-1)*ei1*(hi-him)-(ui-uim) ) * 1;
                      (*w10) = c * ( ei2*(hi-him)+(ui-uim) ) * ei1;    
                      (*w11) = c * ( (-1)*ei1*(hi-him)-(ui-uim) ) * ei2;
}

ですから、ここで何が起こっているのかわかりません。for ループの内側に気付いた場合は、3 次元配列 Waves の値を出力しており、次のサンプル出力が得られます。

...
i= 47, 0.000000  0.000000
       -0.000000  0.000000

i= 48, 0.000000  0.000000
       -0.000000  0.000000

i= 49, -1.000000  -1.000000
        1.414214  -1.414214
...

これは正しい値です。ただし、for ループの直後に Waves の値を出力すると、次のようになります。

...
i= 47, 0.000000  0.000000
      -1.000000  -1.000000

i= 48, 0.000000  0.000000
       0.000000  0.000000

i= 49, -1.000000  -1.000000
        0.000000  0.000000
...

forループが終了したときに値が変わる理由が本当にわかりません。どんな助けでも大歓迎です.(Evals 配列と maxEval 変数はループ後に正しい値を保持します.)

4

1 に答える 1

0

私の質問を読むのに時間を割いてくれた人たちに感謝し、いくつかのコメントへの返信が遅れて申し訳ありませんが、私は別のプロジェクトで忙しかったです.

したがって、この投稿を読んだ後、問題を解決しました。

3D配列はCでどのように保存されますか?

したがって、コメントが何をしているのかを説明しようとしてもまったく役に立たなかったことはわかっていますが、最終的には行列の配列を保存しようとして煮詰まってしまいました。したがって、配列 A[x][y] を 2 次元配列と考えることができ、それらの z を A[x][y][z] として格納したいと考えました。

C が 2 次元配列を線形配列として格納することは知っていましたが、上記のリンクの記事を読んだ後、配列の 3 番目の行列の [0][1] の位置に 7 を格納しようとすると、次のようになることがわかりました。

A[0][1][3]=7;

後でそれを取得しようとすると、別のものが得られます。その理由は、この方法で格納しようとすると、C が 3 次元配列を 1-D 配列として格納する方法を考慮に入れる必要があったため、インデックスが異なるためです。

A[x][y][z] を、それぞれ z 要素を持つ x 配列の配列として読み取っていたはずです。私の目的 (z 行列の配列を格納する) の最後に、どのような作業が行われましたか:

A[z][x][y];
A[3][0][1]=7;

そうすれば、後で取得すると、

printf("The value at A[3][0][1]= %d",A[3][0][1]);

正しい値の 7 が出力されます。

この記事は、私が言おうとしたことをよりよく説明しています。誰かもっとアイデアやコメントがあれば教えてください。

于 2013-03-26T15:30:54.023 に答える