Erreur lors du tri d'un tableau(malloc) en C
Sno_Opy
-
loupius -
loupius -
Bonjour,
Je bloque sur ce problème depuis plusieurs jours. Je dois créer un programme de gestion bancaire en C. Pour ce faire je sauve les données des comptes dans un fichier et je créé un autre fichier qui me sert d'index. Le problème est que tout se déroule parfaitement dans ce programme excepté lors de l'éxécution de la fonction de tri de l'index. La fenêtre d'éxécution du compilateur freeze ou je reçois un message de general protection fault. Quelqu'un peut-il m'aider? Voici le code de la fonction:
void trie_index()
{
struct compte_index temp;
int idx,
taille_reduite,
debut,
fin,
milieu,
pos,
indice;
struct compte_index *ptr_tab;
ptr_tab = (struct compte_index*) malloc(nbre_vrais_enreg*sizeof(struct compte_index));
ptr_flux_index = fopen(fichier_index, "r+b");
if (ptr_flux_index == NULL)
ptr_flux_index = fopen(fichier_index, "w+b");
fseek(ptr_flux_index, sizeof(struct compte_index), SEEK_SET);
for(indice=0;indice<nbre_vrais_enreg;indice++)
fread(&ptr_tab[indice], sizeof(struct compte_index), 1, ptr_flux_index);
// si je place un clrscr(); ici il s'exécute
debut=0;
fin=nbre_vrais_enreg-1;
while (debut<=fin)
{
milieu = (debut + fin)/2;
if (debut == fin)
{
if (ptr_tab[milieu].num_de_cpt.num > ptr_tab[nbre_vrais_enreg-1].num_de_cpt.num)
pos = milieu-1;
else
pos = milieu ;
}
else
{
if (ptr_tab[milieu].num_de_cpt.num > ptr_tab[nbre_vrais_enreg-1].num_de_cpt.num)
fin = milieu - 1;
else
debut = milieu + 1;
}
}
//si je place un clrscr(); ici il ne s'exécute pas.
temp=ptr_tab[nbre_vrais_enreg-1];
for(idx=nbre_vrais_enreg-2;idx>=pos;idx--)
{
ptr_tab[idx+1]=ptr_tab[idx];
}
ptr_tab[pos]=temp;
fseek(ptr_flux_index, sizeof(struct compte_index), SEEK_SET);
for(indice=0;indice<nbre_vrais_enreg;indice++)
fwrite(&ptr_tab[indice], sizeof(struct compte_index), 1, ptr_flux_index);
free(ptr_tab);
fclose(ptr_flux_index);
}
En vous remerciant d'avance.
Je bloque sur ce problème depuis plusieurs jours. Je dois créer un programme de gestion bancaire en C. Pour ce faire je sauve les données des comptes dans un fichier et je créé un autre fichier qui me sert d'index. Le problème est que tout se déroule parfaitement dans ce programme excepté lors de l'éxécution de la fonction de tri de l'index. La fenêtre d'éxécution du compilateur freeze ou je reçois un message de general protection fault. Quelqu'un peut-il m'aider? Voici le code de la fonction:
void trie_index()
{
struct compte_index temp;
int idx,
taille_reduite,
debut,
fin,
milieu,
pos,
indice;
struct compte_index *ptr_tab;
ptr_tab = (struct compte_index*) malloc(nbre_vrais_enreg*sizeof(struct compte_index));
ptr_flux_index = fopen(fichier_index, "r+b");
if (ptr_flux_index == NULL)
ptr_flux_index = fopen(fichier_index, "w+b");
fseek(ptr_flux_index, sizeof(struct compte_index), SEEK_SET);
for(indice=0;indice<nbre_vrais_enreg;indice++)
fread(&ptr_tab[indice], sizeof(struct compte_index), 1, ptr_flux_index);
// si je place un clrscr(); ici il s'exécute
debut=0;
fin=nbre_vrais_enreg-1;
while (debut<=fin)
{
milieu = (debut + fin)/2;
if (debut == fin)
{
if (ptr_tab[milieu].num_de_cpt.num > ptr_tab[nbre_vrais_enreg-1].num_de_cpt.num)
pos = milieu-1;
else
pos = milieu ;
}
else
{
if (ptr_tab[milieu].num_de_cpt.num > ptr_tab[nbre_vrais_enreg-1].num_de_cpt.num)
fin = milieu - 1;
else
debut = milieu + 1;
}
}
//si je place un clrscr(); ici il ne s'exécute pas.
temp=ptr_tab[nbre_vrais_enreg-1];
for(idx=nbre_vrais_enreg-2;idx>=pos;idx--)
{
ptr_tab[idx+1]=ptr_tab[idx];
}
ptr_tab[pos]=temp;
fseek(ptr_flux_index, sizeof(struct compte_index), SEEK_SET);
for(indice=0;indice<nbre_vrais_enreg;indice++)
fwrite(&ptr_tab[indice], sizeof(struct compte_index), 1, ptr_flux_index);
free(ptr_tab);
fclose(ptr_flux_index);
}
En vous remerciant d'avance.
A voir également:
- Erreur lors du tri d'un tableau(malloc) en C
- Trier un tableau excel - Guide
- Tableau word - Guide
- Tableau ascii - Guide
- Imprimer un tableau excel - Guide
- Tableau croisé dynamique - Guide
6 réponses
bonjour
ptr_tab = (struct compte_index*) malloc(nbre_vrais_enreg*sizeof(struct compte_index));
nbre_vrais_enreg est un int ou long en variable globale ?
ptr_tab = (struct compte_index*) malloc(nbre_vrais_enreg*sizeof(struct compte_index));
nbre_vrais_enreg est un int ou long en variable globale ?
C'est un int en variable globale qui est correspond au nombre d'enregistrements dans le fichier.
Voici également les structures utilisées dans cette fonction:
struct numero
{
int bank_id;
long num;
int check_digit;
};
struct compte_index
{
struct numero num_de_cpt;
int position;
};
Voici également les structures utilisées dans cette fonction:
struct numero
{
int bank_id;
long num;
int check_digit;
};
struct compte_index
{
struct numero num_de_cpt;
int position;
};
Non pas de ligne en particulier. Ca compile c'est pendant l'exécution que cela plante. Je n'ai pas réussi à isoler le problème avec le débogage.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
as tu essayé :
ptr_tab = (struct compte_index*) calloc(nbre_vrais_enreg,sizeof(struct compte_index));
au lieu de
ptr_tab = (struct compte_index*) malloc(nbre_vrais_enreg*sizeof(struct compte_index));
ptr_tab = (struct compte_index*) calloc(nbre_vrais_enreg,sizeof(struct compte_index));
au lieu de
ptr_tab = (struct compte_index*) malloc(nbre_vrais_enreg*sizeof(struct compte_index));
Il y a 2 problèmes dans ton algorithme:
- 'fseek...' te positionne à la fin du premier enregistrement: le premier enregistrement ne sera donc pas lu et le dernier sera n'importe quoi.
- supposons maintenant que dans la boucle while (debut<=fin), tu aies à un moment ou un autre 'debut = fin', alors la boucle se poursuit et le test if (debut == fin) te fait passer soit dans pos = milieu-1 soit dans pos = milieu et la boucle continue ad vitam eternam... car 'pos' n'est pas utilisé.
Bonne continuation.
- 'fseek...' te positionne à la fin du premier enregistrement: le premier enregistrement ne sera donc pas lu et le dernier sera n'importe quoi.
- supposons maintenant que dans la boucle while (debut<=fin), tu aies à un moment ou un autre 'debut = fin', alors la boucle se poursuit et le test if (debut == fin) te fait passer soit dans pos = milieu-1 soit dans pos = milieu et la boucle continue ad vitam eternam... car 'pos' n'est pas utilisé.
Bonne continuation.