-1
프로그램에 문제가 있습니다. 데이터를 가져 오는 중에 두 번째 데이터가 입력되면 프로그램이 중지되고 SIGSEGV 오류가 발생합니다 (p.s. 구조체로 작업 중입니다).구조체에 SIGSEGV 오류가 발생하는 이유는 무엇입니까?
이 여기에 코드입니다 :
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int codice;
char nom[20];
char cogn[20];
int n_sin_trat;
int n_sin_conc;
int compenso;
} Dip;
int main()
{
int n_dip;
int i,p,sin_no_conc1, sin_no_conc2, comp_tot;
int scambio;
do{
printf("Inserire numero dipendenti: ");
scanf("%d", &n_dip);
}while(n_dip<=0);
Dip tab_dip[n_dip];
Dip temp;
do{
i=i+1;
do{
printf("Inserire il codice del dipendente: ");
scanf("%d\n", &tab_dip[i].codice);
}while(tab_dip[i].codice<0);
printf("Inserire il nome del dipendente: ");
scanf("%s\n", tab_dip[i].nom);
printf("Inserire il cognome del dipendente: ");
scanf("%s\n", tab_dip[i].cogn);
do{
printf("Inserire il numero di sinistri trattati: ");
scanf("%d\n", &tab_dip[i].n_sin_trat);
}while(tab_dip[i].n_sin_trat<0);
do{
printf("Inerire il numero di sinistri conclusi");
scanf("%d\n", &tab_dip[i].n_sin_conc);
}while(tab_dip[i].n_sin_conc>=tab_dip[i].n_sin_trat);
do{
printf("Immettere il compenso per sinistro");
scanf("%d\n", &tab_dip[i].compenso);
}while(tab_dip[i].compenso>0);
}while(i<n_dip);
p=n_dip;
do{
scambio=0;
i=0;
do{
i=i+1;
sin_no_conc1=tab_dip[i].n_sin_trat-tab_dip[i].n_sin_conc;
sin_no_conc2=tab_dip[i+1].n_sin_trat-tab_dip[i+1].n_sin_conc;
if(sin_no_conc1>sin_no_conc2){
temp=tab_dip[i];
tab_dip[i]=tab_dip[i+1];
tab_dip[i+1]=temp;
scambio=1;
}
}while(i<p-1);
p=p-1;
}while(scambio==0);
i=0;
do{
i=i+1;
printf("%d\n",tab_dip[i].codice);
printf("%s\n",tab_dip[i].nom);
sin_no_conc1=tab_dip[i].n_sin_trat-tab_dip[i].n_sin_conc;
printf("%d\n", sin_no_conc1);
comp_tot=sin_no_conc1*tab_dip[i].compenso;
printf("%d\n", comp_tot);
}while(i<n_dip);
return 0;
}
편집
이제 입력 단계에서 작동하지만 버블 정렬 (I 버블 정렬을 사용하는 것이 의무가 있어요)와 데이터를 주문하려고 할 때, 프로그램이 작동을 멈 춥니 다. 여기 코드는 다음과 같습니다
for (p = n_dip, scambio = 0; scambio==0; p--) {
scambio=0;
for (i = 0; i < p - 1; i++) {
sin_no_conc1=tab_dip[i].n_sin_trat-tab_dip[i].n_sin_conc;
sin_no_conc2=tab_dip[i+1].n_sin_trat-tab_dip[i+1].n_sin_conc;
if(sin_no_conc1>sin_no_conc2){
temp=tab_dip[i];
tab_dip[i]=tab_dip[i+1];
tab_dip[i+1]=temp;
scambio=1;
}
}
}
가'i'를 초기화 할 수 있습니다. 또한 C의 배열은 '0'에서 'size - 1'로 인덱싱됩니다. –
그것은 bubblesort가 아니며, 반 선택 정렬 일뿐입니다. "(p = n_dip, scambio = 0; scambio! = 0; p--) {"에 대해 생각하고 두 가지에 대해 생각하십시오. 1) 왜 P와 역방향으로 계산합니까? 2) 매번 배열 전체를 스윕해야합니까? 훨씬 간단한 방법으로이 작업을 수행 할 수 있습니다. –
대학 선생님이 버블 정렬로 제시했기 때문에 무슨 말을해야할지 모르겠군요. –