3

私はCに非常に慣れていないため、次のことに問題があります。配列を初期化します。

double Cx[101];
for(int i=0; i<101; i++){
  Cx[i]=-5+i*0.1;
}

double Q[2][101];
double y[101];

メインメソッドの外に次の関数があります。

double InitHeight(double g, double dx, double x){
  return 3;
}

double InitMom(double g, double dx, double x){
 return 2;
}

double plainTopo(double x){
 return x*10;
}

さて、メインメソッドでは、次のことを行います。

double g=1;
double dx=0.1;
for(int i=0; i<101; i++){
  Q[1][i] = InitHeight(g,dx,Cx[i]);
  Q[2][i] = InitMom(g,dx,Cx[i]);
  y[i] = plainTopo(Cx[i]);
}

したがって、私の問題は、Cx 配列の元の値が変更されることです。元の Cx の一部を次に示します。

-5.000000
-4.900000
-4.800000
-4.700000
-4.600000
-4.500000
-4.400000
...

コードを実行すると、次のようになります。

   Cx[]   Q[1][]   Q[2][]     y[]
2.000000 3.000000 2.000000 20.000000
2.000000 3.000000 2.000000 20.000000
2.000000 3.000000 2.000000 20.000000
2.000000 3.000000 2.000000 20.000000
2.000000 3.000000 2.000000 20.000000
2.000000 3.000000 2.000000 20.000000

Cx 配列が変更される理由は、私の人生ではわかりません。同じ結果で代わりにポインターを使用しようとしましたが、ループで double x = Cx[i] を実行してから x を関数に渡しましたが、再び Cx が変更されました。

どんな助けでも大歓迎です。

4

4 に答える 4

6

Q間違ってインデックスを作成しています。C の配列インデックスは 1 ではなく 0 から始まります。

double g=1;
double dx=0.1;
for(int i=0; i<101; i++){
  Q[0][i] = InitHeight(g,dx,Cx[i]); /* Used to be Q[1][i] */
  Q[1][i] = InitMom(g,dx,Cx[i]); /* Used to be Q[2][i] */
  y[i] = plainTopo(Cx[i]);
}

get が変更される理由についてCxは、配列内の範囲外の項目にアクセスすると、未定義の動作が発生します。つまり、C コンパイラは、思い通りに何でもできるということです。特定のコンパイラは、への割り当てを生成しCxます。技術的には、これは配列がスタックに配置される方法によるものですが、コンパイラーはコンパイラーと同じことを行う必要はなく、代わりにプログラムをクラッシュさせることを選択できます (これが最良のケースです。バグを見つけるのに役立ちます)、他のデータの上に上書きする (これはあなたが見ているものです)、またはすべてのファイルを削除します (私が知っているコンパイラは実際にこれを行いません)。本当に、コンパイラには完全な自由があります未定義の動作が発生するたびに感じるほどの大混乱を引き起こします。そのような状況の 1 つは、範囲外の配列インデックスにアクセスする場合です。

于 2013-03-21T22:30:45.747 に答える
5

これは array の境界を超え、Q未定義の動作を引き起こします:

Q[1][i] = InitHeight(g,dx,Cx[i]);
Q[2][i] = InitMom(g,dx,Cx[i]);

である必要がQ[0]あり、次Q[1]のようQに定義されています。

double Q[2][101];

コード内の他のインデックス付けは、配列インデックスがゼロベースであり、配列内の要素数が0どこN - 1から始まるかを認識していることを示しています。N

于 2013-03-21T22:30:29.040 に答える
1
double g=1;
double dx=0.1;
for(int i=0; i<101; i++){
  Q[1][i] = InitHeight(g,dx,Cx[i]);
  Q[2][i] = InitMom(g,dx,Cx[i]);
  y[i] = plainTopo(Cx[i]);
}

利用可能な Q[2][i] がないため、おそらく Cx 配列に上書きされています

あなたが言いたかったのは

Q[0][i] = InitHeight(g,dx,Cx[i]);
Q[1][i] = InitMom(g,dx,Cx[i]);
于 2013-03-21T22:32:43.307 に答える
1
double Q[2][101];
:
Q[2][i] = InitMom(g,dx,Cx[i]);

Q の法的なインデックスに が含まれていないため、破損が発生していますQ[2][...]

i配列に対して0から100まで反復するので、これを知っているように見えるCx[101]ので、一時的な間違いのように見えます-配列のすべての次元で同じルールです。

于 2013-03-21T22:32:43.493 に答える