Erreur lors du tri d'un tableau(malloc) en C

Fermé
Sno_Opy - 26 août 2009 à 05:53
 loupius - 26 août 2009 à 13:33
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.
A voir également:

6 réponses

jaky1212 Messages postés 126 Date d'inscription mardi 25 août 2009 Statut Membre Dernière intervention 4 mars 2013 8
26 août 2009 à 08:35
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 ?
0
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;
};
0
jaky1212 Messages postés 126 Date d'inscription mardi 25 août 2009 Statut Membre Dernière intervention 4 mars 2013 8
26 août 2009 à 08:52
le compilateur indique une ligne en particulier ? avec le debogage sa donne quoi ?
0
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jaky1212 Messages postés 126 Date d'inscription mardi 25 août 2009 Statut Membre Dernière intervention 4 mars 2013 8
26 août 2009 à 08:58
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));
0
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.
0