2011-07-03 43 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元件。