C - Liste doublement chainée et Valgrind

Fermé
Nucarp Messages postés 1 Date d'inscription mardi 12 avril 2011 Statut Membre Dernière intervention 12 avril 2011 - 12 avril 2011 à 18:21
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 - 14 avril 2011 à 05:33
Bonjour,

Je suis en pleine réalisation d'un projet utilisant une liste doublement chaînée afin d'y stocker une liste de mesure correspondant à une partition.
J'ai traité pratiquement tous les cas demandés toutefois en testant les premières fonctions de bases de ma liste avec l'option valgrind, j'obtiens un certains nombre d'erreur de lecture et d'écriture (invalid write/read) provenant sans doute d'une mauvaise allocation ou libération de mémoire. J'arrive d'habitude toujours à m'en sortir mais cette fois-ci je vais devoir faire appel à vous comme dernière chance!

Je vous poste les quelques fonction et définitions de type nécessaire à la compréhension de mon problème, si nécessaire je peux biensur encore en rajouter.

Merci d'avance



typedef struct
{int taille;
char* note;
}mesure;

mesure mesurenouv (int temps)
{mesure menouv;
int i;
menouv.taille=temps;
menouv.note=(char*)malloc(temps*sizeof(char));
if(menouv.note==NULL)
exit(1);
for(i=0;i<menouv.taille;i++)
{menouv.note[i]='_';
}
return menouv;
}

typedef struct meliste
{struct meliste* prev;
struct meliste* next;
mesure me;
}Strliste;


typedef struct
{Strliste* debut;
Strliste* fin;
int longueur;
}PartListe,*Partition;

//J'ai quelques doutes sur l'allocation d'une nouvelle liste (?)
Partition Partnouv ()
{Partition p=(PartListe*)malloc(sizeof(PartListe));
p->debut=NULL;
p->fin=NULL;
p->longueur=0;
return p;
}

//D'après valgrind les erreurs d'écriture viendraient de cette fonction ajouter une mesure en tête
Partition AdjMet (Partition p, mesure m)
{Strliste* new=(Strliste*)malloc(sizeof(Strliste));
if(new==NULL)
exit(1);
new->me=m;
new->prev=NULL;
new->next=p->debut;
if(estVide(p))
{p->debut=new;
p->fin=new;
}
else
{(p->debut)->prev=new;
p->debut=new;
}
p->longueur=(p->longueur)+1;
free(new);
return p;
}

//Et les erreurs de lecture de la fonction d'affichage qui pourtant me parait bonne
void affiche_partition (Partition p)
{int i=0;
Strliste* tmp=p->debut;
if(p==NULL)
printf("| ");
while(i<p->longueur)
{printf("|");
affiche_mesure(tmp->me);
tmp=tmp->next;
i++;
}
printf("|\n");
}

//Voici donc le contenu de ma fonction main() avec laquelle j'effectue mes tests
int main ()
{int taille;
mesure me1;
Partition p1;
p1=Partnouv();
printf("Combien de temps par mesure?\n");
scanf("%d",&taille);
me1=mesurenouv(taille);
AdjMet(AdjMet(AdjMet(p1,me1),me1),me1);
affiche_partition(p1);
free(p1);
liberer_mesure(me1);
return 0;
}


//Veuillez m'excuser pour la taille du post mais je ne pense pas que la moindre personne puisse y comprendre quelque chose sans avoir ces précisions.

//D'avance merci!

A voir également:

1 réponse

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
14 avril 2011 à 05:33
Bonjour,
dans la fonction AdjMet et autres p n'est pas un pointeur
Partition AdjMet (Partition p, mesure m);
mais vous utilisez ->
p->debut=new; au lieu de p.debut=new;

exemple si ça peut vous aider :
typedef struct{
    char *chaine;
}world;
typedef struct{
    int num;
    world texte;
}hello;

hello exemple1(hello test,int n){
    test.texte.chaine=malloc(sizeof(char)*n);
    return test;
}
void exemple2(hello *test,int n){
    test->texte.chaine=malloc(sizeof(char)*n);
}
0