2016-05-28 3 views
0

私は、挿入アルゴリズムを実装するために、insort関数を呼び出そうとします。どういうわけか、途中で私は、端末がセグメンテーション障害を印刷する間違いをいくつかしました。助けてください。ありがとう!挿入の並べ替えを使用している間のセグメンテーションフォルト

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

おっと!どういうわけか、このコードをデバッガで実行しようとすると、誤って代わりにスタックオーバーフローに投稿されました!デバッガは、どのラインに問題があるのか​​を正確に教えてくれるので、それを修正するための道が開かれます。デバッガの出力を理解できない場合は、戻ってそのことに関する*具体的な質問をすることができます。 –

+1

名前 'argc'と' argv'を交換しないと、プログラムが読めなくなります。 –

答えて

3

コンパイル時に、コンパイラが発行する警告に注意してください。

それぞれの警告について、それが与えられた理由とそれを正しく修正する方法を理解する必要があります。

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

次のもの:

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

それを修正するために、main上方全体insort機能を移動、これらを解決する最上部に次の行を挿入する

$ 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] 

関数。

次の1

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

この1つは本当に悪いです。パラメータint *A[]は実際にはint **Aを意味し、intへのポインタへのポインタです。これを修正するには、角括弧を削除します。

次の

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

&オペレータは不要です。配列を関数に渡すと、配列の先頭へのポインタに減衰します。 &を削除します。

さて、プログラムは警告を与えることなくコンパイルします。それは良い。次のレベル:

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

ワウ。これらの警告がすべて有効になっていても、コンパイラはもう文句を言わない。それは良い。

(コンパイラがコードを最適化したときに、彼らは唯一のためにテストされているので-Os最適化オプションは、警告の一部を有効にする必要があります。)

今、プログラムがコンパイルされます。それを実行するとき、それは無限ループで立ち往生しているようです。しかし、最悪のエラーは修正されました。

関連する問題