2012-04-30 10 views
0

私の年末プロジェクトでは、画像処理と人工知能アプリケーションを開発する必要があります。無関係なオブジェクトの中で配列が変更される

私の画像処理はすでに完了していますので、私はAIに移動します。しかし、私はここに問題があります。

ここでは、状況を説明しようとします。

正しい画像処理のためには、チェッカーのルールによってボードを検証できるAIが必要です。だから私は最後の既知の状態でプレイフィールドの現在の状態を確認する必要があります。

このため、私はcurrentBoard 2次元配列のオブジェクトを作成しました。 currentBoard(=最後に知られている状態)でボードの生の入力を検証する方法です。

しかし、別のオブジェクト、私の画像処理オブジェクトが、彼の方法で終了したとき。 AIオブジェクトの配列currentBoardが変更されます。

これは、メインフォーム内で作成した新しい配列でも同じです。私はこれがヒープ/スタックの原因だと思う。

私は自分の問題をはっきりと理解してくれることを願っています。私は状況を説明するのが最善ではないことを知っているので、あなたが完全に部品を理解していないときに教えてください。

+0

?おそらくあなたはあなたの 'currentBoard'の深いコピーを作る必要がありますか? –

+0

あなたが実装したいのは、不変オブジェクトと防御的なコピーです。 – DarthVader

+0

@DarthVaderオブジェクトの "currentBoard"を更新する必要があるので、私は変更可能なオブジェクトが必要だと思うか、ここで間違っていますか?そして、あなたは防衛的なコピーを説明することができます、私は言葉を理解していないとグーグルは本当に多くを説明しませんでした。 – Mathieu

答えて

1

配列は参照型です。したがって、配列の内容を変更すると、同じオブジェクトへの参照を保持する他のコードで配列の内容が変更されます。

アレイを変更しないようにするには、2次元アレイのディープコピーを作成し、そのコピーを使用する必要があります。

 int[][] original = {new[] {1,2,3}, new[] {4,5,6}}; 

     int[][] deepCopy = new int[original.Length][]; 

     for (int index = 0; index < original.Length; index++) 
     { 
      var row = original[index]; 
      int[] rowCopy = new int[row.Length]; 
      row.CopyTo(rowCopy, 0); 

      deepCopy[index] = rowCopy; 
     } 

あなたはまた、いくつかの簡単なLINQを使用して同じ結果を生成することができます:私たちは、アレイとその内部の配列の両方の深いコピーを取らなければならないことに注意してください

コードを見てどのよう
int[][] deepCopyLinq = original.Select(x => x.ToArray()).ToArray(); 
+0

私の神。これは私の問題かもしれません。どのように私はこれを忘れてしまったのですか...ありがとう、私はそれに取り組むことができ、解決されたかどうかを伝えます:D – Mathieu

関連する問題