2D массив объекта C # - PullRequest
       5

2D массив объекта C #

0 голосов
/ 09 ноября 2018

Я знаю, что этот вопрос, возможно, часто задают, но, тем не менее, я не могу решить его, используя решение, которое дают люди. Итак, у меня также есть исключение «System.NullReferenceException:« Ссылка на объект не установлена ​​на экземпляр объекта. »При попытке использовать 2D-массив объекта. Итак, вот не рабочий код:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace Console_multi_fonctionnelle_basique
    {
        partial class Program
        {
             public class SudokuSolver
             {
                 //Initialisation code
                 public SudokuSolver()
                 {
                     GridValue[,] SudokuGrid = new GridValue[9, 9];
                     SudokuDisplay(SudokuGrid);
                     Console.ReadKey();
                }
                //Store values for every slot
                class GridValue
                {
                    public bool CanBe1 { get; set; } = false;
                    public bool CanBe2 { get; set; } = false;
                    public bool CanBe3 { get; set; } = false;
                    public bool CanBe4 { get; set; } = false;
                    public bool CanBe5 { get; set; } = false;
                    public bool CanBe6 { get; set; } = false;
                    public bool CanBe7 { get; set; } = false;
                    public bool CanBe8 { get; set; } = false;
                    public bool CanBe9 { get; set; } = false;
                    public bool AlreadySolved { get; set; } = false;
                    public int Value { get; set; } = 0;
                }
                //Display the grid
                void SudokuDisplay(GridValue[,] Sudoku)
                {
                    Sudoku[1, 1].Value = 1;
                    Sudoku[1, 2].Value = 2;
                    Console.WriteLine(Sudoku[0, 0].Value + Sudoku[1,0].Value);
                }
                //To Do
                //Ask the values for every slot
                //Verify if the slot can contain a number
                //Choose the most appropriated number for the slot
                //End the program after user pressing an key
            }
        }
    }

Итак, как вы можете видеть, я хочу использовать 2D-массив класса "GridValue" размером 9x9, чтобы у каждого "слота сетки" была своя собственная переменная для последующего решения судоку. Но программа выглядит так, как будто не понимает, что мой Array содержит объекты "GridValue", поэтому он, похоже, не понимает, что каждое значение Array содержит несколько переменных ... Поэтому мне хотелось бы получить переменную для одного из объектов в Массив без получения исключения.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Вы создали пустой массив, поэтому при попытке доступа к элементу выдается исключение. Инициализируйте элементы вашего массива, и все будет в порядке.

public class SudokuSolver
{
    //Initialisation code
    public SudokuSolver()
    {
        GridValue[,] SudokuGrid = new GridValue[9, 9];

    //###################

        for (int r=0; r < 9; r++) 
        { 
            for (int c = 0; c < 9; c++) 
            { 
                SudokuGrid[r, c] = new GridValue(); 
            } 
        }

    //###################

        SudokuDisplay(SudokuGrid);
        Console.ReadKey();
    }
    //Store values for every slot
    class GridValue
    {
        public bool CanBe1 { get; set; } = false;
        public bool CanBe2 { get; set; } = false;
        public bool CanBe3 { get; set; } = false;
        public bool CanBe4 { get; set; } = false;
        public bool CanBe5 { get; set; } = false;
        public bool CanBe6 { get; set; } = false;
        public bool CanBe7 { get; set; } = false;
        public bool CanBe8 { get; set; } = false;
        public bool CanBe9 { get; set; } = false;
        public bool AlreadySolved { get; set; } = false;
        public int Value { get; set; } = 0;
    }
    //Display the grid
    void SudokuDisplay(GridValue[,] Sudoku)
    {
        Sudoku[1, 1].Value = 1;
        Sudoku[1, 2].Value = 2;
        Console.WriteLine(Sudoku[0, 0].Value + Sudoku[1, 0].Value);
    }
    //To Do
    //Ask the values for every slot
    //Verify if the slot can contain a number
    //Choose the most appropriated number for the slot
    //End the program after user pressing an key
}
0 голосов
/ 09 ноября 2018

Надеюсь, этот пример поможет вам понять ООП. Добро пожаловать в сообщество!

using System;

namespace ConsoleApp1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            SudokuSolver sudokuSolver = new SudokuSolver(9, 9);

            sudokuSolver.DisplayGrid();

            Console.ReadKey();
        }
    } 


    public class SudokuSolver
    {
        //Store every values needed for every "slot"
        public class GridValue
        {
            public bool CanBe1 { get; set; } = false;
            public bool CanBe2 { get; set; } = false;
            public bool CanBe3 { get; set; } = false;
            public bool CanBe4 { get; set; } = false;
            public bool CanBe5 { get; set; } = false;
            public bool CanBe6 { get; set; } = false;
            public bool CanBe7 { get; set; } = false;
            public bool CanBe8 { get; set; } = false;
            public bool CanBe9 { get; set; } = false;
            public bool AlreadySolved { get; set; } = false;
            public int Value { get; set; } = 0;
        }

        public GridValue[,] SudokuGrid { get; }

        //Code d'initialisation
        public SudokuSolver(int x, int y)
        { 
            // only initialize in the constructor, no calls
            SudokuGrid = new GridValue[x, y]; // the array exists now in mem, but each entry is pointing to null
            for (int i = 0; i < x; i++)
            {
                for (int j = 0; j < y; j++)
                {
                    SudokuGrid[i, j] = new GridValue();
                }
            }
        }



        //Display the grid => then name it that way!
        public void DisplayGrid()
        {
            SudokuGrid[1, 1].Value = 1;
            SudokuGrid[1, 2].Value = 2;
            Console.WriteLine(SudokuGrid[0, 0].Value + SudokuGrid[1, 0].Value);
        }


     }

}
...