-1

皆さんにお聞きする問題があります。

以下に示すクラスがあります。

public class Node
        {
            public int Kova1;               // Kova 1
            public int Kova2;               // Kova 2
            public int Kova3;               // Kova 3

            public int ActionNo;            // Yapılan İşlem

            public Node(int kova1, int kova2, int kova3, int actionNumber)
            {
                Kova1 = kova1;
                Kova2 = kova2;
                Kova3 = kova3;
                ActionNo = actionNumber;
            }

            public Node(int kova1, int kova2, int kova3)
            {
                Kova1 = kova1;
                Kova2 = kova2;
                Kova3 = kova3;
            }

            public Node()
            {
            }

            public Node AnneNode;
        }

そしてこれらの機能:

public void CocukNodeOlustur(LinkedList<Node> Acik, LinkedList<Node> Kapali, Node temp)
{
    Node cocukState;

    Node temp2 = temp;

    for (int i = 0; i < 12; i++)
    {
        cocukState = YeniStateOlustur(temp, i);

        if ((ActionKontrol(cocukState)) && (GoalBulundu(Acik, Kapali, cocukState)) &&
        ((cocukState.Kova1 != temp2.Kova1) && (cocukState.Kova2 != temp2.Kova2) && (cocukState.Kova3 != temp2.Kova3)))
        {
            cocukState.AnneNode = temp;
            Acik.AddFirst(temp);
        }
    }
}

public Node YeniStateOlustur(Node s, int j)
{
    int tempKova1, tempKova2, tempKova3;

    Node yeniCocuk = new Node();

    yeniCocuk = s;
    yeniCocuk.ActionNo = j;

    // Gelen numaraya göre uygulanan işlemin seçimi yapılıyor.
    switch (j)
    {
        case 0:
            {
                yeniCocuk.Kova1 += (3 - yeniCocuk.Kova1);
                yeniCocuk.Kova2 += 0;
                yeniCocuk.Kova3 += 0;
            }
            break;
        case 1:
            {
                yeniCocuk.Kova1 += 0;
                yeniCocuk.Kova2 += (5 - yeniCocuk.Kova2);
                yeniCocuk.Kova3 += 0;
            }
            break;
    }

    return yeniCocuk;
}

主な機能で

            Node temp = new Node();

            while (!(Acik.Count == 0))
            {
                p.CocukNodeOlustur(Acik, Kapali, temp);
                Kapali.AddLast(temp);
            }

したがって、プログラムをデバッグすると、コードがYeniStateOlustur()関数にジャンプするたびに、プログラム内のすべてのNodeインスタンスがYeniStateOlustur()の変更の影響を受けることがわかります。関数内のインスタンスがNodeクラスのすべてのインスタンスを上書きしているようです

なぜそれが起こるのか分かりませんか?

どうすればこれを克服できますか?

長いポストをよろしくお願いします。

4

1 に答える 1

1

問題は、すべてのノードが同じインスタンスであるということです。サンプルコードには「newNode()」が2回だけ含まれており、2番目のケース(メソッド内YeniStateOlustur)では、新しいインスタンスはすぐに破棄されます。したがって、その関数は、渡されたのと同じノードを返します。

public Node YeniStateOlustur(Node s, int j)  
{  
    int tempKova1, tempKova2, tempKova3;  

    Node yeniCocuk = new Node();  

    yeniCocuk = s;  

    //...

    return yeniCocuk;    
}    

このメソッドCocukNodeOlusturでは、すべてのノード変数が同じノードを指します。

public void CocukNodeOlustur(LinkedList<Node> Acik, LinkedList<Node> Kapali, Node temp) 
{ 
    // here, temp == temp
    Node cocukState;
    // now, temp == temp and cocukState is uninitialized.
    Node temp2 = temp; 
    // now, temp == temp, temp2 == temp, and cocukState is uninitialized.

    for (int i = 0; i < 12; i++) 
    { 
        cocukState = YeniStateOlustur(temp, i); 
        // now, temp == temp, temp2 == temp, and cocukState == temp

        if ((ActionKontrol(cocukState)) && (GoalBulundu(Acik, Kapali, cocukState)) && 
        ((cocukState.Kova1 != temp2.Kova1) && (cocukState.Kova2 != temp2.Kova2) && (cocukState.Kova3 != temp2.Kova3))) 
        { 
            cocukState.AnneNode = temp; 
            Acik.AddFirst(temp); 
        } 
    } 
} 

あなたのコードはNodeが値型(struct)であると想定しているようですが、それは明らかに参照型(class)です。違いがわからない場合は、一歩下がって、読んで実験する必要があります。

簡単な修正は、Nodeの宣言を構造体に変更することかもしれませんが、それはお勧めしません。構造体を使用したプログラミングは非常に難しい場合があります。これは、構造体とクラスの違いについての理解が不安定な場合に特に当てはまります。

于 2012-10-05T22:37:36.390 に答える