2015-04-29 2 views
0

Я работаю над преобразованием пакетной игры, которую я создал в C++ для ее дальнейшего продвижения, и столкнулся с многочисленными проблемами, одним из которых является массив, который мне нужен для nodeMatrix (карта мира). Мне нужна карта 100 x 100 с 20 значениями данных на метр.Ошибка с C++ Массивы и память

int nodeMatrix[99][99][19]; 

Но проблема в том, когда я пытаюсь установить нулевой (или ungenerated) состояние карты, она падает с (0xc0000005), поэтому я добавил визуальный к сценарию , который печатает текущий узел сбрасывается (это гораздо медленнее, хотя),

void emptydata(){ 

    int temp_x = 0; 

    int temp_y = 0; 

    int temp_t = 0; 

    do{ 

    temp_y = 0; 

    do{ 

     temp_t = 0; 

     do{ 

      nodeMatrix[temp_x][temp_y][temp_t] = 0; 

      //visual 

      cout << temp_x << " " << temp_y << " " << temp_t << endl; 

      temp_t ++; 

     }while(temp_t <= 50); 

     temp_y ++; 

    }while(temp_y <= 99); 

    temp_x ++; 

}while(temp_x <= 99); 

} 

это происходит сбой при 99 14 10 каждый раз, (она начинается с нуля, так 100 15 11), это будет 16500 укусы данные?

В любом случае, это что-то с распределением памяти? Я не могу понять это.

+2

Вы делаете 'в то время как (temp_t <= 50) ', но размер третьего измерения массива равен только 19. – phantom

+0

Интересно, может ли быть более простым в изучении язык, например ruby, java или C#, стать лучшим следующим шагом в обучении программированию. – kristianp

+0

Я оригинал сделал это в пакетном режиме, теперь я воссоздал его как консольное приложение в C++, java не работал, я использую его для генераторов имен. @kristianp –

ответ

1

Похоже, ваша проблема в том, что вы выделили массив 99 на 99 по 19, а не массив 100 на 100 на 20. Объявление массива принимает количество элементов, а не индекс max.

Я не знаю, как вы получили temp_y = 14 и temp_t = 10, но это, кажется, подтверждается тем фактом, что он выходит из строя при temp_x = 99.

Если вы размещаете, что фактическое сообщение об ошибке его было бы более полезно.


Похоже, что вы также ограничены temp_t на 50, а не 20, но я думаю, что это была опечатка. Кроме того, как стилистическая нота, для циклов чаще встречаются в C++, поскольку они будут обрабатывать индексацию для вас.

+0

Спасибо за примечание для циклов, оно будет рассмотрено ... также, когда программа «сбой», я имею в виду, что она останавливается, и в окнах говорится, что она перестала отвечать. Я компилирую его внутри code :: blocks, иначе я бы не получил код выхода, он просто закроется. –

+0

Я попытался опубликовать редактирование, но у меня нет достаточной репутации для публикации изображений. Это как какая-то больная игра ... –

1

Ваше определение говорит [99] [99] [19], но вы проверяете для [100] [100] [51] (в то время как (temp_t < = 50), в то время как (temp_y < = 99), temp_x < = 99).

temp_t будет проходить от 0 до 50 -> 51 элементов.

temp_y будет идти от 0 до 99 -> 100 элементов.

temp_x будет идти от 0 до 99 -> 100 элементов.

Когда вы выходите из зарезервированной памяти для массива вы получаете защищенное исключение памяти ...

Кроме того, для ясности, используйте для шлейфов:

int nodeMatrix[100][100][20]; 

for(int x = 0; x < 100; x++) 
{ 
    for(int y = 0; y < 100; y++) 
    { 
     for(int z = 0; z < 20; z++) 
     { 
      nodeMatrix[x][y][z] = 0; 
     } 
    } 
} 
+0

Благодарим вас за гораздо более простое использование циклов, в частности «за», это будет рассмотрено. Еще одно замечание: со стороны механики у меня есть координаты X/Y и типы T, типы биома, localshrine, ориентир и т. Д. И если вы хотите, чтобы оригинальная версия партии могла отправить ее вам. @Gusman –

Смежные вопросы