2010-10-18 1 views
1

Это скорее всего проблема, но следующий код умирает. Я создаю многомерный массив из 2 классов, Cell и Map. Карта представляет собой сетку ячеек X по Y. Довольно нормально до сих пор (я продолжаю переписывать эту же программу, когда я изучаю новый язык). Для краткости я просто опубликую классы и базовый тест, отражающий ошибку. Когда я иду, чтобы распечатать карту весь массив сетки я initalized во время construtor исчезает, когда я иду на печать (Null исключение, так как сетка заканчивается пустой, как некоторые ...)Изучение проблем с C# с массивом (данные массива исчезают)

//misc using up here 

namespace Mapper { 
class Program { 

static void Main(string[] args) 
{ //TODO Parser 

int max_x=2; 
int max_y=2; 

Map myMap = new Map(max_x,max_y); 
myMap.print(); 


} 

class Cell 
{ 
public char type='o'; 
public Cell(char inittype){ 
this.type=inittype; 
} 

public void printCell(){ 
Console.Write(this.type); } 

public void set(char value){ 
this.type = value; } 
} 

class Map 
{ 
private int max_X; //global 
private int max_Y; //global 
public Cell[,] grid; //global 

public Map(int maxX, int maxY) { 
Cell[,] grid = new Cell[maxX, MaxY]; 
this.max_X = maxX; //Store constructor provided dimensions for global use 
this.max_Y = maxY; 
for(int yv=0; yv &lt max_Y; yv++){ 
    for(int xv=0, xv &lt max_X;xv++){ 
    grid[xv,yx] = new Cell('x'); 
    } 
} 

public void print() { 
for(int yv=0; yv &lt max_Y; yv++){ 
    for(int xv=0, xv &lt max_X;xv++){ 
    grid[xv,yx].printCell(); 
    } 
} 

}} 

Запуск трассировки все выглядит хорошо, пока линия myMap карты завершается ... другими словами, похоже, что конструктор не «приклеивается», и я получаю пустую сетку в конце (все они идут null.) Я могу только предположить, что это проблема с областью. .. что мне не хватает ....? Я купил конструктора?

ответ

8

Проблема здесь:

public Cell[,] grid; //global 

public Map(int maxX, int maxY) { 
    Cell[,] grid = new Cell[maxX, MaxY]; 
    ... 

Вы объявили член экземпляра под названием сетки и локальная переменная называется сетка, но вы только обновление локальной переменной.

Чтобы это исправить, измените последнюю строку вышеописанного это:

grid = new Cell[maxX, maxY]; 

У вас также есть большое количество ошибок компиляции в коде - код в вопросе не могли быть кода, который вы Бег. В следующий раз используйте копию и вставку, чтобы скопировать код в вопрос.

Также комментарий //global вводит в заблуждение. Член экземпляра не является глобальной переменной. Ближайшим эквивалентом глобальной переменной в C# является статический член.

+0

Глобальная ссылка была «глобальная видимость внутри самого класса», а не вся программа. – Idgarad

0

В вашем конструкторе вы назначаете локальную переменную сетки, а не переменную сетки класса.

Cell[,] grid = new Cell[maxX, MaxY]; 

должен быть

this.grid = new Cell[maxX, maxY]; 
+0

Это работало как чемпион! Спасибо. – Idgarad

0

В конструкторе вы объявляя Cell [,] сетку, которая скрывается класс уровня клеток [,] сетку. :)