2016-05-28 14 views
0

Ich versuche, den Einfügealgorithmus durch Aufrufen der Funktion insort zu implementieren. Irgendwie habe ich auf dem Weg einige Fehler gemacht, dass der Terminal Segmentierungsfehler ausdruckt. Bitte helfen Sie. Vielen Dank!Segmentierungsfehler bei Verwendung der Einfügesortierung

int 
main(int argv,char *argc[]){ 
    int A[argv-2]; 
    for(int i=1;i<argv;i++){ 
     A[i-1]=atoi(*(argc+i)); 
    } 
    insort(&A,argv-1,0); 
    for(int i=0;i<argv-1;i++){ 
     printf("%d",A[i]); 
    } 
    printf("\n"); 
    return 0; 
} 

int 
insort(int *A[],int size,int n){ 
    int temp; 
    if(n<size){ 
     for(int i=n;i>=0 && *(A+i)>*(A+i-1);i--){ 
      temp=*(A+i-1); 
      *(A+i-1)=*(A+i); 
      *(A+i)=temp; 
     } 
    } 
    return insort(A,size,n++); 
} 
+3

Hoppla! Irgendwie, wenn Sie versuchen, diesen Code über einen Debugger auszuführen, haben Sie ihn versehentlich auf Stack Overflow hochgeladen! Ein Debugger wird Ihnen genau sagen, in welcher Zeile das Problem liegt, was Sie auf den Weg bringt, das Problem zu beheben. Wenn Sie die Ausgabe des Debuggers nicht verstehen, können Sie zurückkommen und eine * spezifische * Frage dazu stellen. –

+1

Tauschen Sie niemals die Namen 'argc' und' argv' aus, dies macht das Programm unlesbar. –

Antwort

3

Wenn jedes Programm kompilieren, achten Sie auf die Warnungen, die der Compiler emittiert.

Für jede der Warnungen müssen Sie verstehen, warum es gegeben ist und wie es richtig zu beheben ist.

$ gcc -std=c99 insort.c 
insort.c:7:9: warning: implicit declaration of function 'atoi' [-Wimplicit-function-declaration] 
insort.c:11:9: warning: implicit declaration of function 'printf' [-Wimplicit-function-declaration] 

diese zu beheben, die folgenden Zeilen an der Spitze ein:

#include <stdio.h> // for printf 
#include <stdlib.h> // for atoi 

Der nächste:

insort.c:10:5: warning: implicit declaration of function 'insort' [-Wimplicit-function-declaration] 

es zu beheben, über die die gesamte insort Funktion bewegen main Funktion.

die nächste:

insort.c:23:17: warning: assignment makes integer from pointer without a cast 

Dieses ist wirklich schlecht. Der Parameter int *A[] bedeutet wirklich int **A, was ein Zeiger auf einen Zeiger auf int ist. Um dies zu beheben, entfernen Sie die eckigen Klammern.

die nächste:

insort.c:22:12: warning: passing argument 1 of 'insort' from incompatible pointer type 

Der & Betreiber ist nicht notwendig. Wenn Sie ein Array an eine Funktion übergeben, verfällt es in einen Zeiger auf den Anfang des Arrays. Entfernen Sie die &.

Jetzt kompiliert das Programm, ohne irgendwelche Warnungen zu geben. Das ist gut. Nächste Ebene:

$ gcc -std=c99 -Wall -Wextra -Os insort.c 

Wow. Selbst wenn alle diese Warnungen aktiviert sind, beschwert sich der Compiler nicht mehr. Das ist gut.

(Die -Os Optimierungsoption ist notwendig, einige der Warnungen zu aktivieren, da sie nur für getestet werden, wenn der Compiler den Code optimiert.)

Jetzt wird das Programm kompiliert wird. Wenn es läuft, scheint es in einer endlosen Schleife stecken zu bleiben. Aber die schlimmsten Fehler sind jetzt behoben.

Verwandte Themen