【问题标题】:Two separate arrays receive same value when changing the value of one of the arrays更改其中一个数组的值时,两个单独的数组接收相同的值
【发布时间】:2020-02-21 15:09:19
【问题描述】:

我正在为学校做一个 Sudoku-Solving 项目,不知何故,我的两个数组以某种方式链接在一起,当我更改 array1 中的值时,它也会更改 array2 中的值。 请不要因为我的代码风格而讨厌我,一旦完成,我会清理/改进代码。

我已经声明了两个不同的字符串数组变量: sudokuFieldssudokuUnsolved

我只是更改sudokuFields 的值,而不是sudokuUnsolved 的值,但不知何故,当我调试时,数组总是具有相同的值..

非常欢迎任何帮助。

这是我的代码:

class SudokuAlgorithm
{
    public string[,] sudokuFields;
    public string[,] sudokuUnsolved;
    public bool corectRow;
    public bool correctColumn;
    public bool correctField;
    private static int UNASSIGNED = 0;


    public SudokuAlgorithm()
    {
        sudokuFields = new string[9, 9];
    }

    public SudokuAlgorithm(string[,] sudoku, int indexRow, int indexColumn)
    {
        this.sudokuFields = sudoku;
        sudokuUnsolved = sudoku;
        correctRow = TestRow(indexRow, indexColumn);
        correctColumn = TestColumn(indexRow, indexColumn);
        correctField = TestArea(indexRow, indexColumn);
        SolveSudoku();
    }

    private void SolveSudoku()
    {
        for(int i=0;i<9;i++) //Column
        {
            for(int j=0;j<9;j++) // Row
            {
                if(SudokuFieldFree(j,i) == true)
                {
                    for(int k=1;k<=9;k++)
                    {
                        sudokuFields[i, j] = k.ToString();
                        if(TestRow(j,i) == false || TestColumn(j,i) == false || TestArea(j,i) == false)
                        {
                            sudokuField[i, j] = "";
                        }
                        else
                        {
                            break;
                        }
                    }
                    if (sudokuFields[i, j] == "")
                    {
                        if(j!=0)
                        {
                            for(int l =j-1;l>=0;l--)
                            {
                                if (SudokuAreaFreeUnsolved(l, i) == true)
                                {
                                    j = l-1;
                                    sudokuFields[i, l] = "";
                                    break;
                                }
                            }
                        }
                        else
                        {
                            i = i - 1;
                            j = 8;
                        }
                    }
                }
            }
        }
    }

    private bool SudokuAreaFree(int indexRow, int indexColumn)
    {
        bool free= false;

        if (sudokuFields[indexColumn, indexRow] == "" || sudokuFields[indexColumn, indexRow] == " " || sudokuFields[indexColumn, indexRow] == null)
        {
            free = true;
            return free;
        }

        return free;
    }


    private bool SudokuAreaFreeUnsolved(int indexRow, int indexColumn)
    {
        bool frei = false;

        if (sudokuUnsolved[indexColumn, indexRow] == "" || sudokuUnsolved[indexColumn, indexRow] == " " || sudokuUnsolved[indexColumn, indexRow] == null)
        {
            free= true;
            return free;
        }

        return free;
    }


    private bool TestRow(int indexRow, int indexColumn)
    {
        bool valid = true;
        for (int i = 0; i < 9; i++)
        {
            for (int j = 0; j < 9; j++)
            {
                if (sudokuFields[i, indexRow] == sudokuFields[j, indexRow] && sudokuFields[i, indexRow] != " " && i != j)
                {
                    valid = false;
                    return valid;
                }
            }
        }
        return valid;
    }

    private bool TestColumn(int indexRow, int indexColumn)
    {
        bool valid = true;
        for (int i = 0; i < 9; i++)
        {
            for (int j = 0; j < 9; j++)
            {
                if (sudokuFields[indexColumn, i] == sudokuFields[indexColumn, j] && sudokuFields[indexColumn, i] != " " && i!=j)
                {
                    valid = false;
                    return valid;
                }
            }
        }
        return valid;
    }

    private bool TestArea(int indexRow, int indexColumn)
    {
        bool valid = true;

        if (indexColumn >= 0 && indexColumn <= 2 && indexRow >= 0 && indexRow <= 2)
        {
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    if (sudokuFields[indexColumn, indexRow] == sudokuFields[i, j] && sudokuFields[indexColumn, indexRow] != " " && indexColumn != i && indexRow != j)
                    {
                        valid = false;
                        return valid;
                    }
                }
            }
        }
        else if (indexColumn >= 3 && indexColumn <= 5 && indexRow >= 0 && indexRow <= 2)
        {
            for (int i = 3; i < 6; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    if (sudokuFields[indexColumn, indexRow] == sudokuFields[i, j] && sudokuFields[indexColumn, indexRow] != " " && indexColumn != i && indexRow != j)
                    {
                        valid = false;
                        return valid;
                    }
                }
            }
        }
        else if (indexColumn >= 6 && indexColumn <= 8 && indexRow >= 0 && indexRow <= 2)
        {
            for (int i = 6; i < 9; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    if (sudokuFields[indexColumn, indexRow] == sudokuFields[i, j] && sudokuFields[indexColumn, indexRow] != " " && indexColumn != i && indexRow != j)
                    {
                        valid = false;
                        return valid;
                    }
                }
            }
        }
        else if (indexColumn >= 0 && indexColumn <= 2 && indexRow >= 3 && indexRow <= 5)
        {
            for (int i = 0; i < 3; i++)
            {
                for (int j = 3; j < 6; j++)
                {
                    if (sudokuFields[indexColumn, indexRow] == sudokuFields[i, j] && sudokuFields[indexColumn, indexRow] != " " && indexColumn != i && indexRow != j)
                    {
                        valid = false;
                        return valid;
                    }
                }
            }
        }
        else if (indexColumn >= 3 && indexColumn <= 5 && indexRow >= 3 && indexRow <= 5)
        {
            for (int i = 3; i < 6; i++)
            {
                for (int j = 3; j < 6; j++)
                {
                    if (sudokuFields[indexColumn, indexRow] == sudokuFields[i, j] && sudokuFields[indexColumn, indexRow] != " " && indexColumn != i && indexRow != j)
                    {
                        valid = false;
                        return valid;
                    }
                }
            }
        }
        else if (indexColumn >= 6 && indexColumn <= 8 && indexRow >= 3 && indexRow <= 5)
        {
            for (int i = 6; i < 9; i++)
            {
                for (int j = 3; j < 6; j++)
                {
                    if (sudokuFields[indexColumn, indexRow] == sudokuFields[i, j] && sudokuFields[indexColumn, indexRow] != " " && indexColumn != i && indexRow != j)
                    {
                        valid = false;
                        return valid;
                    }
                }
            }
        }
        else if (indexColumn >= 0 && indexColumn <= 2 && indexRow >= 6 && indexRow <= 8)
        {
            for (int i = 0; i < 3; i++)
            {
                for (int j = 6; j < 9; j++)
                {
                    if (sudokuFields[indexColumn, indexRow] == sudokuFields[i, j] && sudokuFields[indexColumn, indexRow] != " " && indexColumn != i && indexRow != j)
                    {
                        valid = false;
                        return valid;
                    }
                }
            }
        }
        else if (indexColumn >= 3 && indexColumn <= 5 && indexRow >= 6 && indexRow <= 8)
        {
            for (int i = 3; i < 6; i++)
            {
                for (int j = 6; j < 9; j++)
                {
                    if (sudokuFields[indexColumn, indexRow] == sudokuFields[i, j] && sudokuFields[indexColumn, indexRow] != " " && indexColumn != i && indexRow != j)
                    {
                        valid = false;
                        return valid;
                    }
                }
            }
        }
        else if (indexColumn >= 6 && indexColumn <= 8 && indexRow >= 6 && indexRow <= 8)
        {
            for (int i = 3; i < 6; i++)
            {
                for (int j = 6; j < 9; j++)
                {
                    if (sudokuFields[indexColumn, indexRow] == sudokuFields[i, j] && sudokuFields[indexColumn, indexRow] != " " && indexColumn != i && indexRow != j)
                    {
                        valid = false;
                        return valid;
                    }
                }
            }
        }

        return valid;
    }
}

}

【问题讨论】:

  • 您将构造函数数组参数sudoku 分配给两个变量,因此它们指向同一个数组。
  • @Jonas,如果您在提出问题时遵循this postthis post 的建议,您可能会得到更好的答复。发布一堵巨大的代码墙供人们筛选。创建 MCR 可以帮助人们帮助您。
  • 为了扩展 @JanWichelmann 所说的,C# 数组是引用类型,因此通过将 sudoku 分配给两个变量,它们都引用同一个数组。
  • 这两个引用都被分配到内存中的相同位置:this.sudokuFelder = sudoku; sudokuUngeloest = sudoku;。为什么他们是一样的?

标签: c# arrays


【解决方案1】:
 class Program
{
    public string[] strA;
    public string[] strB;

    public void SetAB(string[] strC)
    {
        this.strA = strC;
        this.strB = strC;
    }

    public void SetA()
    {
        this.strA = new string[2] { "set from SetA()", "set from SetA()" };
    }

    static void Main(string[] args)
    {

        Program p = new Program();

        p.SetAB(new string[2] { "set from SetAB()", "set from SetAB()" });
        Console.WriteLine("strA[0] = " + p.strA[0]);
        Console.WriteLine("strB[0] = " + p.strB[0]);

        Console.WriteLine();

        p.strA[0] = "Test";
        Console.WriteLine("strA[0] = " + p.strA[0]);
        Console.WriteLine("strB[0] = " + p.strB[0]);

        // Why result is such?

        //strA[0] = set from SetAB()
        //strB[0] = set from SetAB()

        //strA[0] = Test
        //strB[0] = Test

        p.SetA();
        Console.WriteLine();
        Console.WriteLine("Now strA and strB are no more attached to same reference object ");
        Console.WriteLine("strA[0] = " + p.strA[0]);
        Console.WriteLine("strB[0] = " + p.strB[0]);

        //strA[0] = set from SetA()
        //strB[0] = Test
    }

正如他们对您所说,您的问题是这些代码行。

this.sudokuFelder = sudoku;
    sudokuUngeloest = sudoku;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 2022-06-16
    • 2019-08-06
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多