2011-07-03 4 views
-1
#include <iostream> 
using namespace std; 

void initializeMap(int mapSizeX, int mapSizeY, int map[][10]) 
{ 
    // Map details: 
    // 0 = # (wall) 
    // 1 = space (free space) 
    // 2 = x (player) 

    for(int x = 0; x < mapSizeX; x++) 
    { 
     map[x][0] = 0; 
    } 

    for(int y = 0; y < (mapSizeY - 2); y++) 
    { 
     map[0][y] = 0; 

     for(int x = 0; x < (mapSizeX - 2); x++) 
     { 
      map[x][y] = 1; 
     } 

     map[mapSizeX][y] = 0; 
    } 

    for(int x = 0; x < mapSizeX; x++) 
    { 
     map[x][mapSizeY - 1] = 0; 
    } 
} 

void paintMap(int mapSizeX, int mapSizeY, int map[][10]) 
{ 
    for(int y = 0; y < mapSizeY; y++) 
    { 
     for(int x = 0; x < mapSizeX; x++) 
     { 
      switch(map[x][y]) 
      { 
       case 0: 
        cout << "#"; 
        break; 

       case 1: 
        cout << " "; 
        break; 

       case 2: 
        cout << "x"; 
        break; 

      } 

      cout << map[x][y]; 
     } 
     cout << endl; 
    } 
} 

int main() 
{ 
    int mapSizeX = 10; 
    int mapSizeY = 10; 
    int map[10][10]; 
    initializeMap(mapSizeX, mapSizeY, map); 
    paintMap(mapSizeX, mapSizeY, map); 

    cout << endl << endl; 

    return 0; 
} 

Мой код отлично компилируется без ошибок, но когда я пытаюсь запустить его, он просто говорит «Ошибка сегментации». Я провел некоторое исследование, и я не понимаю, почему я его получаю, потому что я вообще не использую указатели. Как это исправить? Я скомпилирую его с помощью g ++ и запускаю его, просто набрав ./main в терминале.Ошибка сегментации

ответ

4
map[mapSizeX][y] = 0; 

Это незаконно. Допустимые значения индекса начинаются от 0 до mapSizeX - 1.

Линия должна быть:

map[mapSizeX][y] = 0; 

Один предполагает, что это желаемый результат?

#0#0#0#0#0#0#0#0#0#0 
#0 1 1 1 1 1 1 1 1#0 
#0 1 1 1 1 1 1 1 1#0 
#0 1 1 1 1 1 1 1 1#0 
#0 1 1 1 1 1 1 1 1#0 
#0 1 1 1 1 1 1 1 1#0 
#0 1 1 1 1 1 1 1 1#0 
#0 1 1 1 1 1 1 1 1#0 
#0 1 1 1 1 1 1 1 1#0 
#0#0#0#0#0#0#0#0#0#0 

Если да, то у вас есть ряд других ошибок, отходящих по одному в вашей initializeMap функции. Вместо того, чтобы:

for(int y = 0; y < (mapSizeY - 2); y++) 

и

for(int x = 0; x < (mapSizeX - 2); x++) 

вы должны использовать

for(int y = 1; y < (mapSizeY - 1); y++) 

и

for(int x = 1; x < (mapSizeX - 1); x++) 

соответственно.


Кстати, вот уборщик способ написать initializeMap:

template<int mapSizeX, int mapSizeY> 
void initializeMap(int (&map)[mapSizeX][mapSizeY]) 
{ 
    for(int y = 0; y < mapSizeY; y++) { 
    for(int x = 0; x < mapSizeX; x++) { 
     if (x == 0 || x + 1 == mapSizeX || y == 0 || y == mapSizeY) 
     map[x][y] = 0; 
     else 
     map[x][y] = 1; 
    } 
    } 
} 

А вы можете назвать это только с

initializeMap(map); 

Нет необходимости передавать размер, компилятор будет фигурировать его вне автоматически.

+0

Спасибо, что исправил это! Выход должен быть таким, как вы описали, но без цифр, которые были добавлены случайно. –

0

я не выглядел достаточно глубоко, чтобы знать, является ли проблема только с кодом, но

map[mapSizeX][y] = 0; 

запишет выше границы массива.

0

Во втором для петли initializeMap -

map[mapSizeX][y] = 0; 

mapSizeX 10 и нет 10*y элемента в матрице.

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