Я нахожусь в конце своих нервов, с помощью этого Кодекса. Когда я пытаюсь запустить его, он выходит из строя, и если я пытаюсь отлаживать, он получает: Ошибка приема программы SIGSEGV.Получающий сигнал Ошибка сегментации 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;}
Чтобы объяснить, что даже происходит:
Я получил charackter массив [ 11] [11], с «O» на месте 5,5. Код проверяет все направления, и если это пробел, он перемещается к этому каналу и маркирует его также «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);} }
Когда он доберется до точки, где он не может перейти в другое направление, потому что он застрял в звёздах '*', он отправится в последнюю точку, где у него есть как минимум два выбора. Этот момент были спасены: ничтожной IFO (INT х, Int у) {
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--; }
}
после того, как он прибыл, на месте «а 'и' b ', он добавляет один на' L ', поэтому по модулю L получается! = 0. это означает, что теперь он пойдет по другому пути, он бы не пошел в прошлый раз. В каждом пакете кода он спрашивает, имеет ли следующий шаг влево или вправо равный «A» (немецкий для Ausgang, английский для выхода), если это произойдет, оно должно распечатать весь массив и выйти.
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);
}
Надеюсь, я мог бы объяснить это немного понятным. Извините за мои плохие знания английского языка.
Проверьте, 'обр [у] [х-1]' , arr [y-1] [x] 'и т. д. находятся в массиве перед доступом к ним. – MikeCAT
Извините, я не получил его – Scarh
, если вы вызываете ifo с такими номерами, как ifo (50,50), вы превысите границу массива. – ojblass