2017-01-27 1 views
-1

J'ai un problème avec mon programme: lors de l'acquisition de données, lorsque j'entre en entrée les secondes données, le programme s'arrête et une erreur SIGSEGV se produit (p.s. je travaille avec des structures).Pourquoi je reçois une erreur SIGSEGV avec des structures?

Voici le code:

#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; 
} 

EDIT

Maintenant, les travaux de la phase d'entrée, mais lorsque je tente d'obtenir des données avec une sorte de bulle (je suis obligé d'utiliser le tri à bulles), le programme cesse de fonctionner. Voici le code:

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

Vous avez oublié d'initialiser 'I'. De plus, les tableaux de C sont indexés de '0' à' taille-1'. –

+0

Ce n'est pas de la giflerie, et c'est seulement une sorte de demi-sélection. Commencez par "pour (p = n_dip, scambio = 0; scambio! = 0; p--) {" et pensez à deux choses: 1) pourquoi comptez-vous inverser avec p? et 2) dois-je balayer l'ensemble du tableau à chaque fois? Vous pouvez le faire d'une manière beaucoup plus simple. –

+0

Je ne sais pas quoi dire parce que professeur d'université l'a présenté comme un genre de bulle .. –

Répondre

0

C'est un peu mieux comme une question de révision du code:

#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

Merci pour les conseils, je vais les utiliser dans les questions à venir. –