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;
}
}
}
Vous avez oublié d'initialiser 'I'. De plus, les tableaux de C sont indexés de '0' à' taille-1'. –
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. –
Je ne sais pas quoi dire parce que professeur d'université l'a présenté comme un genre de bulle .. –