2015-12-05 2 views
0

Я нахожусь в конце своих нервов, с помощью этого Кодекса. Когда я пытаюсь запустить его, он выходит из строя, и если я пытаюсь отлаживать, он получает: Ошибка приема программы 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); 

} 

Надеюсь, я мог бы объяснить это немного понятным. Извините за мои плохие знания английского языка.

+0

Проверьте, 'обр [у] [х-1]' , arr [y-1] [x] 'и т. д. находятся в массиве перед доступом к ним. – MikeCAT

+0

Извините, я не получил его – Scarh

+0

, если вы вызываете ifo с такими номерами, как ifo (50,50), вы превысите границу массива. – ojblass

ответ

2

Используйте отладчик. Если вы используете GDB, вы можете остановиться на SEGV с помощью:

(gdb) handle SIGSEGV stop

(gdb) r - запускает программу

(gdb) backtrace

Смежные вопросы