2016-05-28 9 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

Упс! Как-то, пытаясь запустить этот код через отладчик, вы случайно отправили его на Stack Overflow! Отладчик скажет вам, в какой строке возникла проблема, которая поставит вас на путь исправления. Если вы не понимаете вывод отладчика, вы можете вернуться и задать * конкретный * вопрос об этом. –

+1

Никогда не меняйте имена 'argc' и' argv', это делает программу нечитаемой. –

ответ

3

При компиляции любой программы обратите внимание на предупреждения, которые испускает компилятор.

Для каждого предупреждения вы должны понять, почему это дано и как правильно его исправить.

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

Чтобы исправить это, вставьте следующие строки на самом верху:

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

Следующая один:

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

Чтобы это исправить, переместите всю insort функцию над main функция.

следующий:

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

Это один очень плохо. Параметр 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 

Wow. Даже если все эти предупреждения включены, компилятор больше не жалуется. Это хорошо.

(опция -Os оптимизации необходимо включить некоторые предупреждения, так как они испытывают только когда компилятор оптимизирует код.)

Теперь программа компилируется. При запуске он кажется застрявшим в бесконечном цикле. Но худшие ошибки фиксируются сейчас.

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