我试图使用指针的多维数组,这是我的地图,所以在最后的代码我可以使用指针,而不是使碰撞为每个地图。不幸的是,在绘制地图后,当我按箭头移动时,程序崩溃了。调试器只告诉我标题
中的内容这是其中一个地图:
char *map2[15] = {
"###^######^###",
"#L #",
"^S #",
"#S #",
"# K #",
"########### #",
"#G #",
"# #### #",
"# #M #",
"# @ # #",
"## ########^##"};
这是开始:
mainmap = false;
x = 2;
game.showing_different_maps(15, map2); // (y, somemap)
显示地图和移动:
void Game::showing_different_maps(int y, char **somemap)
{
bool differentmap = true;
while (differentmap)
{
system("cls");
for(int i = 0; i < y; i++) // i < map2[y][]
{
cout << somemap[i] << endl; // drawing a map !THIS CAUSES CRASH!
}
system("pause>nul");
if(GetAsyncKeyState(VK_UP))
{
mapki.move(-1, 0);
}
if(GetAsyncKeyState(VK_DOWN))
{
mapki.move(1, 0);
}
if(GetAsyncKeyState(VK_RIGHT))
{
mapki.move(0, 1);
}
if(GetAsyncKeyState(VK_LEFT))
{
mapki.move(0, -1);
}
}
}
脚本处理冲突:
void Maps::move(int V, int H)
{
int y2 = y + V;
int x2 = x + H;
if(map2[y][x2] == ' '
|| map2[y][x2] == 'K'
|| map2[y][x2] == 'W')
{
map2[y][x] = ' ';
x += H;
map2[y][x] = '@';
}
if(map2[y2][x] == ' '
|| map2[y2][x] == 'K'
|| map2[y2][x] == 'W')
{
map2[y][x] = ' ';
y += V;
map2[y][x] = '@';
}
}
我想写到处somemap[][],而不是map2[][],但我不能检查它是否有效,因为"程序收到信号SIGSEGV,分割故障。"崩溃。
这里的错误是由于指针数组被声明为大小为15,但只有11个初始化元素。这意味着最后4个初始化为NULL。事实上,你对map2的声明相当于这个:
char *map2[15] = {
"###^######^###",
"#L #",
"^S #",
"#S #",
"# K #",
"########### #",
"#G #",
"# #### #",
"# #M #",
"# @ # #",
"## ########^##",
NULL, NULL, NULL, NULL};
单独使用是无害的,但您稍后会使用:
game.showing_different_maps(15, map2); // (y, somemap)
所以你结束传递空字符指针给cout <<
所以SIGSEGV。
你至少应该传递初始化的数组大小,这里是11而不是15:
game.showing_different_maps(11, map2); // (y, somemap)
但是我怀疑你以后会在move
中遇到问题,因为你应该测试0 <= y+V <0 <= x+H <HMAX(这里VMAX>