Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2011, 01:40   #1
vitalatron
Пользователь
 
Аватар для vitalatron
 
Регистрация: 03.05.2009
Сообщений: 15
По умолчанию null reference exception, карта проходимости

Вот чего надумал. Пишу движок для простенькой стратежки. Решил урон по площади наносить следующим образом: класс карта состоит из трёх матриц - первая содержит тип земли (land), вторая - матрица препятствий (wall), третья - указателей (units) на всё, что может стоять на карте (класс BattleObj, от него наследуются Unit и Building), при ударе по площади из каждой клетки, попадающей в площадь удара, извлекается ссылка на объект, который будет получать урон.
При инициализации карты все ссылки BattleObj в матрице ссылок по идее null, пока на карте нет ни единого здания или юнита. Вызываю метод у карты RefreshWalls(), который переписывает матрицу препятствий в зависимости от типа земли и указателей на юниты.
Код:
public void RefreshWalls() {
  for (int i = 0; i < size; i++)
    for (int j = 0; j < size; j++)
      wall[i, j] = (land[i, j] == LandType.Rock) || (units[i, j] != null);
}
Вылазит null reference exception при проверке (units[i, j] != null). Как сделать корректно? Или может кто подскажет альтернативный вариант реализации задуманного?
vitalatron вне форума Ответить с цитированием
Старый 15.05.2011, 09:46   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

есть подозение, что units просто вобще не инициализирован. Т.е. объявлен, но не присвоен ничему.

Код ниже работает без проблем.

Код:
namespace ConsoleApplication3
{
    class BattleObj { 
    }

    class Unit : BattleObj { 
    }

    class Building : BattleObj { 
    }

    class game {

        const int size = 10;

        //
        bool[,] wall;
        int [,] land;
        Unit[,] units;

        public void go()
        {
            wall = new bool[size, size];
            land = new int[size, size];
            units = new Unit[size, size];
            //
            RefreshWalls();
        }

        public void RefreshWalls()
        {
            for (int i = 0; i < size; i++)
                for (int j = 0; j < size; j++)
                    wall[i, j] = (land[i, j] == 1) || (units[i, j] != null);
        }
    }

    class Program
    {

        static void Main(string[] args)
        {
            new game().go();
        }

    }
}
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 15.05.2011, 12:13   #3
vitalatron
Пользователь
 
Аватар для vitalatron
 
Регистрация: 03.05.2009
Сообщений: 15
По умолчанию

Видимо, в моих знаниях дырка.
Разве строка
Код:
units = new Unit[size, size];
не создаёт экземпляры классов Unit?

Спасибо большое.
vitalatron вне форума Ответить с цитированием
Старый 15.05.2011, 17:15   #4
Spawn™Production®
Форумчанин
 
Аватар для Spawn™Production®
 
Регистрация: 06.05.2011
Сообщений: 287
По умолчанию

Создаёт, только в Вашем примере мы этой строки не видели и, возможно, что она и не вызывается как раз. С тем же успехом, в принципе, могут быть не инициализированы и массивы wall и/или land.
Spawn™Production® вне форума Ответить с цитированием
Старый 15.05.2011, 17:18   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

разве создает?
помоему по умолчанию эти все элементы массива равны null
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.05.2011, 17:41   #6
Spawn™Production®
Форумчанин
 
Аватар для Spawn™Production®
 
Регистрация: 06.05.2011
Сообщений: 287
По умолчанию

Цитата:
помоему по умолчанию эти все элементы массива равны null
да, но сам units будет не null при этом... проверки на null элементов ведь делаются
Spawn™Production® вне форума Ответить с цитированием
Старый 15.05.2011, 18:37   #7
vitalatron
Пользователь
 
Аватар для vitalatron
 
Регистрация: 03.05.2009
Сообщений: 15
По умолчанию

Разобрался, работает, всем кто помогал - спасибо.
Код:
units = new BattleObj[size, size];
компилируется хорошо, не смотря на то, что BattleObj - абстрактный класс. Видимо так я просто инициализирую ссылку на массив БатлОбжектов.
vitalatron вне форума Ответить с цитированием
Старый 15.05.2011, 18:40   #8
Spawn™Production®
Форумчанин
 
Аватар для Spawn™Production®
 
Регистрация: 06.05.2011
Сообщений: 287
По умолчанию

Цитата:
компилируется хорошо, не смотря на то, что BattleObj - абстрактный класс
Ну да, просто массив с типом BattleObj. Не экземпляр же самого класса...
Spawn™Production® вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
неопределенное обращение (undefined reference) rUs_LAN Win Api 1 28.03.2010 12:35
[Linker error] undefined reference to `__cpu_features init jojahti Общие вопросы C/C++ 1 14.10.2009 13:14
main.cpp:18: undefined reference to `_GetStockObject@4' Как с этим бороться? dvma04 Общие вопросы C/C++ 3 10.10.2009 21:26
[Linker error] undefined reference to `function name` kermit Помощь студентам 4 11.06.2008 09:19
какие функции есть в разделе Lookup & Reference. ?????????: Катруся Помощь студентам 2 09.06.2008 08:24