使用本规范,我感到很紧张。 当我尝试运行它时,它会崩溃,如果我尝试调试,它会得到: 程序接收信号SIGSEGV分段故障。
我完全不知道它有什么问题((
以下是代码:
#include<stdio.h>#include<stdlib.h>
#include<math.h>
#define ROWS 11 //Zeilen
#define COLS 11 //Spalten
#define MAUSX 5
#define MAUSY 5
int a=0;
int b=0;
char l=0;
char arr[ROWS][COLS] =
{
{'*','*','*','*','*','*','*','*','*','*','*'},
{'*','*',' ',' ',' ','*',' ','*',' ',' ','*'},
{'*',' ','*','*',' ',' ',' ','*',' ',' ','*'},
{'*',' ',' ','*',' ','*',' ',' ','*',' ','*'},
{'*','*',' ','*',' ',' ','*',' ',' ',' ','*'},
{'*',' ',' ',' ',' ','o','*',' ','*','*','*'},
{'*',' ','*',' ','*','*','*',' ','*',' ','A'},
{'*',' ','*','*',' ',' ',' ',' ','*',' ','*'},
{'*',' ','*',' ','*',' ','*','*','*',' ','*'},
{'A',' ','*',' ',' ',' ',' ',' ',' ',' ','*'},
{'*','*','*','*','*','*','*','*','*','*','*'},
};
void ifo(int x,int y){
if(arr[y+1][x]==' ' && arr[y][x-1]==' ') {a=y;b=x;}
if(arr[y+1][x]==' ' && arr[y-1][x]==' ') {a=y;b=x;}
if(arr[y+1][x]==' ' && arr[y][x+1]==' ') {a=y;b=x;}
if(arr[y][x-1]==' ' && arr[y-1][x]==' ') {a=y;b=x;}
if(arr[y][x-1]==' ' && arr[y][x+1]==' ') {a=y;b=x;}
if(arr[y-1][x]==' ' && arr[y][x+1]==' ') {a=y;b=x;}
}
int suche(int x, int y){
ifo(x, y);
if(l%2){
if(arr[y][x-1]=='A') { void ausgabe(); }
if(arr[y][x+1]=='A') { void ausgabe(); }
if(arr[y][x-1]==' ') {x--; arr[y][x]='o'; suche(x,y);}
if(arr[y+1][x]==' ') {y++; arr[y][x]='o'; suche(x,y);}
if(arr[y][x+1]==' ') {x++; arr[y][x]='o'; suche(x,y);}
if(arr[y-1][x]==' ') {y--; arr[y][x]='o'; suche(x,y);}
}
else{
if(arr[y][x-1]=='A') { void ausgabe();}
if(arr[y][x+1]=='A') { void ausgabe(); }
if(arr[y-1][x]==' ') {y--; arr[y][x]='o'; suche(x,y);}
if(arr[y][x+1]==' ') {x++; arr[y][x]='o'; suche(x,y);}
if(arr[y+1][x]==' ') {y++; arr[y][x]='o'; suche(x,y);}
if(arr[y][x-1]==' ') {x--; arr[y][x]='o'; suche(x,y);}
}
while(1){
if(y==a && x==b){ l++; break;}
if(arr[y][x-1]=='A') { void ausgabe(); }
if(arr[y][x+1]=='A') { void ausgabe(); }
if(arr[y-1][x]=='o') { arr[y][x]=' '; y--; }
if(arr[y][x+1]=='o') { arr[y][x]=' '; x++; }
if(arr[y+1][x]=='o') { arr[y][x]=' '; y++; }
if(arr[y][x-1]=='o') { arr[y][x]=' '; x--; }
}
suche(x,y);
}
void ausgabe(){
for(int j=0;j<COLS;j++){
for(int i=0;i<ROWS;i++){
printf("%c ", arr[j][i]);
}
printf("\n");
}
exit(0);
}
int main (){
suche(9,7);
return 0;}
解释甚至发生的事情:
我得到了一个[11] [11]元素的charackter数组,在点5,5处有一个'O'。 代码检查所有方向,如果它是一个空格,它会移动到该坐标,并用'O'标记它。
else{if(arr[y][x-1]=='A') { void ausgabe();}
if(arr[y][x+1]=='A') { void ausgabe(); }
if(arr[y-1][x]==' ') {y--; arr[y][x]='o'; suche(x,y);}
if(arr[y][x+1]==' ') {x++; arr[y][x]='o'; suche(x,y);}
if(arr[y+1][x]==' ') {y++; arr[y][x]='o'; suche(x,y);}
if(arr[y][x-1]==' ') {x--; arr[y][x]='o'; suche(x,y);} }
当它到达某一点时,他无法向另一个方向移动,因为他被困在星星'*'中,他将会到达他至少有两个选择去的最后一点。 这一点保存在: void ifo(int x,int y){
if(arr[y+1][x]==' ' && arr[y][x-1]==' ') {a=y;b=x;}
if(arr[y+1][x]==' ' && arr[y-1][x]==' ') {a=y;b=x;}
if(arr[y+1][x]==' ' && arr[y][x+1]==' ') {a=y;b=x;}
if(arr[y][x-1]==' ' && arr[y-1][x]==' ') {a=y;b=x;}
if(arr[y][x-1]==' ' && arr[y][x+1]==' ') {a=y;b=x;}
if(arr[y-1][x]==' ' && arr[y][x+1]==' ') {a=y;b=x;}
}
并且向后移动发生在这一部分:
while(1){
if(y==a && x==b){ l++; break;}
if(arr[y][x-1]=='A') { void ausgabe(); }
if(arr[y][x+1]=='A') { void ausgabe(); }
if(arr[y-1][x]=='o') { arr[y][x]=' '; y--; }
if(arr[y][x+1]=='o') { arr[y][x]=' '; x++; }
if(arr[y+1][x]=='o') { arr[y][x]=' '; y++; }
if(arr[y][x-1]=='o') { arr[y][x]=' '; x--; }
}
他到达后,在现场'a'和'b',他在'L'上加了一个,所以L的模数得到!= 0。这意味着他现在会走另一条路,他上次不会去。 在每一堆Code中,它会询问左侧或右侧的下一步是否等于'A'(出口的德语,出口的英语),如果发生这种情况,它将打印整个数组,然后退出。
void ausgabe(){
for(int j=0;j<COLS;j++){
for(int i=0;i<ROWS;i++){
printf("%c ", arr[j][i]);
}
printf("\n");
}
exit(0);
}
我希望我能解释它有点可以理解。抱歉我的英语知识不足。
答案 0 :(得分:2)
使用调试器。如果您正在使用GDB,则可以使用以下命令停在SEGV:
(gdb) handle SIGSEGV stop
(gdb) r
- 运行程序
(gdb) backtrace