-1

年末のプロジェクトでは、画像処理と人工知能のアプリケーションを開発する必要があります。

画像処理は終わったので、AIに移ります。しかし、ここで問題があります。

ここで状況を説明しようと思います。

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

このために、2 次元配列を持つオブジェクトと、 (= 最後の既知の状態)currentBoardを持つボードの生の入力を検証するメソッドを作成しました。currentBoard

ただし、別のオブジェクト (私の画像処理オブジェクト) が彼のメソッドで終了するとcurrentBoard、AI オブジェクトの配列が変更されます。

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

私の問題を明確にして理解できるようにしたいと思います。私は状況を説明するのが得意ではないことを知っているので、部分を完全に理解していない場合は教えてください.

4

1 に答える 1

1

配列は参照型であるため、ご存知のように、配列の内容を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();
于 2012-05-01T01:03:57.960 に答える