2017-11-12 7 views
-5

do-whileループで以前の反復の変数を使用して、現在の反復で計算を行い、ループの最後に収束テストに使用しようとしています。ここで do-whileループで変数が変わるのはなぜですか?

コード(Javaの):私は、ループの最初に前回の反復からT0 = T2を設定しようとしてる

int z = 0; 
    do { 

     T0 = T2; 

     for (int j = 0; j < K; j++) { 
      for (int i = N - 1; i >= 0; i--) { 
       if (i == 0) { 
        T1[i][j] = T0[i + 1][j] + C[i]; // When x=0, c=0 
       } 
       if (i > 0 && i < N - 1) { 
        T1[i][j] = T0[i + 1][j] + T0[i - 1][j] 
          + C[i]; 
       } 
       if (i == N - 1) { 
        T1[i][j] = T0[i - 1][j] + C[i]; // When x=W, b=0 
       } 

      } 
     } 

     for (int i = 0; i < N; i++) { 
      for (int j = K - 1; j >= 0; j--) { 
       if (j == 0) { 
        T2[i][j] = T1[i][j + 1] + C[j]; // When y=0, c=0 
       } 
       if (j > 0 && j < K - 1) { 
        T2[i][j] = T1[i][j + 1] + T1[i][j - 1] 
          + C[j]; 
       } 
       if (j == K - 1) { 
        T2[i][j] = 273.15; 
       } 

      } 
     } 

     z++; 

    } while (z < 5); 

、およびT0は、現在の反復からT2と比較されますコンバージェンステストのためのループの終わりに(ここには含まれていません)。ループの開始時に、T0は実際には以前の反復からのT2に等しい。しかし、ループの最後では、T0は現在の反復からのT2に等しい。 それでは、反復の中でループの始めから終わりまでT0を変更しないようにするにはどうしたらいいですか? 私はJavaを使い慣れていません。どんなヘルプやコメントもありがとうございます!

更新日: クイックフィードバックをいただきありがとうございます。 System.arraycopy()とarray.clone()の両方が1D配列の仕事をしているようです。私は何かが欠けているかもしれませんが、2D行列をコピーするのはちょっと難しいようですね。しかし、私の目的のために、これも働いていた:

 for (int i=0; i<N;i++) { 
      for (int j=0; j<K;j++) { 
       T0[i][j]=T2[i][j]; 
      } 
     } 
+3

「T0」と「T2」はどのように宣言されていますか? Javaでは、代入だけで配列全体をコピーすることはできません: 'T0 = T2'。これは配列へ* reference *を別の変数にコピーするだけです。したがって、 'T0'のデータを変更すると、' T2'のデータが変更されます。あなたは本当のコピーをする必要があります。参考までに、たとえば、[Make Javaのコピーを作成する](https://stackoverflow.com/questions/5785745/make-copy-of-array-java)を参照してください。ちょうど "Javaのコピーアレイ"で検索してください。 – lurker

+2

こんにちは。できるだけコードから削除してください。ここでは[mcve]に感謝します。あなたのコードには何十もの変数があります。あなたが話していることをどうやって知っているでしょうか? –

+2

私は問題をデバッグするための努力がないように見えるので、この質問をd​​ownvotingしています。コードにprintステートメントを追加して、各ポイントで変数が保持する内容を表示したり、デバッガを使用してプログラムの一部をトレースしたり、紙面上のロジックをトレースするだけで、問題を段階的に処理してください。物事が変わったときにあなたが期待していることを見て、それを見つけたら「なぜT0 [2]を変えるとT2 [2]が同時に変わるのですか? (その答えは、任意のJavaチュートリアルや多くの既存のSOの質問に記載されていますが) –

答えて

0

あなたがT2に値を割り当てるときに、T0とT2の両方で書いているようです。 これは、T0がT2と同じ配列/行列を指しているためです。

割り当てを行う代わりに、配列をディープコピーする必要があります。 array.clone()を使用して、プリミティブの配列のディープコピーを作成するようにしてください(T0とT2のように見えます)。

関連する問題