2017-01-27 6 views
-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; 
     } 
    } 
} 
+0

가'i'를 초기화 할 수 있습니다. 또한 C의 배열은 '0'에서 'size - 1'로 인덱싱됩니다. –

+0

그것은 bubblesort가 아니며, 반 선택 정렬 일뿐입니다. "(p = n_dip, scambio = 0; scambio! = 0; p--) {"에 대해 생각하고 두 가지에 대해 생각하십시오. 1) 왜 P와 역방향으로 계산합니까? 2) 매번 배열 전체를 스윕해야합니까? 훨씬 간단한 방법으로이 작업을 수행 할 수 있습니다. –

+0

대학 선생님이 버블 정렬로 제시했기 때문에 무슨 말을해야할지 모르겠군요. –

답변

0

이 좀 더 적합 코드 리뷰 질문과 같은 것입니다 : 당신은 잊었

#include <stdio.h> 
#include <stdlib.h> 

// Note: Indent and use spaces around punctuation 
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: "); 
     // Note: Check the result of scanf 
     // Note: Scanf doesn't change any variables if it didn't 
     // read them. You've likely been lucky that you randomly had 
     // negative values in these uninitialized variables. 
    } while(scanf("%d", &n_dip) != 1 || n_dip < 0); 

    // Note: Use vertical space to separate sections 
    // c99 dynamic array size 
    Dip tab_dip[n_dip]; 
    Dip temp; 

    // Previously, this code started with do { i = i + 1; 
    // Which would cause an off-by-one error in the code leading to 
    // a crash. C arrays are indexed from 0, so an array of n_dip 
    // values contains tab_dip[0] ... tab_dip[n_dip - 1] 
    // 
    // Your code would start the iteration, then increment i at the top 
    // which even if i was initialized, would have indexed past the 
    // last array element. By convention, code usually increments 
    // indexes at the end. Note that the for loop already does that 
    // and reminds one to initialize the loop variable. 
    for (i = 0; i < n_dip; i++) { 
     do { 
      printf("Inserire il codice del dipendente: "); 
      // Again, check the result of scanf and ensure that it 
      // read a value before checking the value 
     } while(scanf("%d", &tab_dip[i].codice) != 1 || tab_dip[i].codice < 0); 

     printf("Inserire il nome del dipendente: "); 
     scanf("%s", tab_dip[i].nom); 
     printf("Inserire il cognome del dipendente: "); 
     scanf("%s", tab_dip[i].cogn); 

     do { 
      printf("Inserire il numero di sinistri trattati: "); 
     } while(scanf("%d", &tab_dip[i].n_sin_trat) != 1 || tab_dip[i].n_sin_trat < 0); 

     do { 
      printf("Inerire il numero di sinistri conclusi"); 
     } while(scanf("%d", &tab_dip[i].n_sin_conc) != 1 || tab_dip[i].n_sin_conc >= tab_dip[i].n_sin_trat); 

     do{ 
      printf("Immettere il compenso per sinistro"); 
     }while(scanf("%d", &tab_dip[i].compenso) != 1 || tab_dip[i].compenso > 0); 
    } 

    // The comma operator in C can be used to do multiple 
    // initializations or increments in the for loop prelude. 
    // Note that the condition can be any condition. Here, we're 
    // emulating do-while by satisfying the condition on the first 
    // pass. 
    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; 
      } 
     } 
    } 

    for (i = 0; i < n_dip; i++) { 
     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); 
    } 

    return 0; 
} 
+0

팁 주셔서 감사합니다. 앞으로의 질문에서 사용하겠습니다. –