2011-07-03 218 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功能的一些其他的off-by-一個錯誤。相反的:

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元件。