IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[structure et pointeur] problème d'affichage


Sujet :

C

  1. #1
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut [structure et pointeur] problème d'affichage
    Bonsoir,

    Voici une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    void initVoiture(File **file,int nb_voit, int pos_depart)
    {	
    	int i;
    	Voiture *voit=(Voiture *)malloc(sizeof(voit));	
     
    	for(i=0;i<nb_voit;i++)
    	{			
    		voit->pos_depart=pos_depart;
    		voit->pos_arrivee=my_rand();
    		printf("%d %d\n",pos_depart,voit->pos_arrivee);
    		ajoutEnTete(&*file,voit);		
    	}
     
    	free(voit);
    }
    Et voici ce que j'obtiens à l'affichage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    0 1
         16521:     symbol=free;  lookup in file=./carrefour
         16521:     symbol=free;  lookup in file=/lib/tls/i686/cmov/libc.so.6
    0 2
    0 0
    Sachant que je cherche a afficher 2 int à chaque fois correspondant à ma structure Voiture.
    Je n'ai jamais vu ce type d'erreur et apparemment cela provient du free() mais je ne comprends pas pourquoi donc si quelqu'un a une idée, merci d'avance de votre aide !
    This is NOT my boyfriend's computer.

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je ne comprends pas, tu alloues une zone mémoire avec malloc (au passage 2 remarques : en C on ne caste pas le retour de malloc, et puis il FAUT ABSOLUMENT tester ce retour), ensuite tu mémorises ce noeud avec ajoutEnTete(&*file,voit); (au passage tu es certain de &*file ????) et enfin tu libères l'adresse mémorisée, c'est -à-dire qu'elle devient inaccessible, est-ce bien ce que tu veux ???
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    Ben heu... j'ai du faire une grosse boulette oui

    En fait ce que je veux c'est stocker l'info dans une file... Apres le reste peut disparaitre

    merci !
    This is NOT my boyfriend's computer.

  4. #4
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    Personne ne voit ?

    En plus je suis sur que c'est stupide

    merci
    This is NOT my boyfriend's computer.

  5. #5
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Tu fais un malloc (sizeof(voit)) sauf que voit est de type Voiture *, donc tu alloue la place qu'il faudrait à un pointeur et pas la place qu'il faudrait à une Voiture.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Voiture *voit=(Voiture *)malloc(sizeof(Voiture));

  6. #6
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    oui mais quoi que je change, l'affichage reste le meme avec les 2 lignes bizarres...
    This is NOT my boyfriend's computer.

  7. #7
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    On peut pas plus t'aider si on sait pas ce qu'est une File ni ce que fait ajoutEnTete()
    Je pense que les lignes bizarres sont affichées par ajoutEnTete

  8. #8
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    eh bien ajoutEnTete est ma fonction d'ajout d'un element au debut de ma file :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    /*Ajouter un element en tete de file*/
     
    void ajoutEnTete(File **f, void *elem)
    {
    	File *q;
    	q=malloc(sizeof(*f));
     
    	if (f!=NULL && *f!=NULL)
       	{
    		File *p;
          		debutFile(f);
     
          		p=(*f);
     
    		q->info=elem;
            	q->suiv=p;
             	q->prec=NULL;
     
    		if(p!=NULL)
                		p->prec=q;
     
             	(*f)=q;
       	}
    	else {		
    		q->info=elem;
    		q->suiv=(*f);
    		q->prec=NULL;
    		(*f)=q;
    	}
     
    	free(q);
    }
    Avec debutFile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    void debutFile(File **f)
    {
    	if (f!=NULL && *f!=NULL)
       	{
          		while ((*f)->prec!=NULL)
            		precedent(f);
       	}
    }
     
    void precedent(File **f)
    {
    	if (f!=NULL && *f!=NULL)
          		(*f)=(*f)->prec;
    }
    Voila je sais pas si ça peut permettre d'y voir plus clair...

    Ma file :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct file {
    	struct file *suiv;
    	struct file *prec;
    	void *info;
    } File;
    Merci...
    This is NOT my boyfriend's computer.

  9. #9
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Citation Envoyé par kitsune
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void ajoutEnTete(File **f, void *elem)
    {
    	File *q;
    	q=malloc(sizeof(*f));
    Encore une fois tu alloue un pointeur et non un objet (yavait il besoin d'allouer d'ailleurs? )
    Donc tu mets un File ** dans q (qui est un File *)
    J'ai pas encore regardé le reste

  10. #10
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    d'accord mais ça ne change rien... alors c'est moi ou c'est vraiment bizarre ce truc ???

    merci beaucoup en tout cas d'y avoir regardé...
    This is NOT my boyfriend's computer.

  11. #11
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Si j'étais toi, j'utiliserais un debugger pour savoir qu'est ce qui affiche ces messages exactement.
    Quand on a l'habitude du debugger, c'est tres puissant
    En attendant, ya la methode du "je mets des printf un peu partout" pour savoir ce qu'il se passe

  12. #12
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    oui c'est ce que j'ai essayé de faire, de mettre des printf partout... je vais continuer à chercher.
    En fait je suis sous Linux avec KDevelop alors le debugger...
    This is NOT my boyfriend's computer.

  13. #13
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Bonjour,

    Il manque des informations pour aider:

    Comment tu appelles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void ajoutEnTete(File **f, void *elem)
    Comment as-tu déclaré/alloué les paramètres f et elem?

    Dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void ajoutEnTete(File **f, void *elem)
    Ton else est accédé si f est NULL, ce qui serait un problème...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      else {       
          q->info=elem;
          q->suiv=(*f);
          q->prec=NULL;
          (*f)=q;
       }
    Ce free en devrait pas être ici:
    Jc

  14. #14
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    Ben en fait le else c'est pour quand la file est vide au départ, c'est donc pour lui insérer un premier élément avant de pouvoir ajouter en tete.

    Et j'ai mis mon code de ajoutEnTete plus haut mais je ne vois vraiment pas ce qui ne va pas...
    This is NOT my boyfriend's computer.

  15. #15
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par kitsune
    Ben en fait le else c'est pour quand la file est vide au départ, c'est donc pour lui insérer un premier élément avant de pouvoir ajouter en tete.

    Et j'ai mis mon code de ajoutEnTete plus haut mais je ne vois vraiment pas ce qui ne va pas...
    Et qu'as-tu mis dans le main et chaque endroit où tu appelles ajoutEnTete?

    Jc

  16. #16
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    dans mon main j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    File **f;
    *f=creerFile();
    initVoiture(f,5,0);
    et dans mon initVoiture j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void initVoiture(File **file,int nb_voit, int pos_depart)
    {	
    	int i;
     
    	for(i=0;i<nb_voit;i++)
    	{
    		Voiture *voit=(Voiture *)malloc(sizeof(Voiture));	
    		voit->pos_depart=pos_depart;
    		voit->pos_arrivee=my_rand();
    		printf("%d %d\n",voit->pos_depart,voit->pos_arrivee);
    		ajoutEnTete(file,voit);
    	}	
    }
    Mais je sais qu'il doit y avoir une grosse erreur de ma part surtout dans ce cas avec gestion d'une structure de données File comportant des infos de type structure Voiture... Ca fait beaucoup de pointeurs
    This is NOT my boyfriend's computer.

  17. #17
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par kitsune
    dans mon main j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    File **f;
    *f=creerFile();
    initVoiture(f,5,0);
    [/code]
    Est-ce que tu trouves que f est correctement initialisé?

    Il faudrait mieux faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    File *f = creerFile();
    initVoiture(&f,5,0);
    Jc

  18. #18
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    Ah oui effectivement je n'ai plus les 2 lignes bizarres ! Bon il me reste une erreur de segmentation mais bon ça je suis déjà plus habituée

    Mais alors je ne comprends pas pourquoi il faut utiliser les doubles pointeurs dans les fonctions du TDA File puis initialiser sa File avec un pointeur simple ?
    En fait je comprends la structure de la file (un pointeur sur l'element précédent, un pointeur sur le suivant et un pointeur sur l'info du maillon) mais je ne comprends pas pourquoi quand on passe une File en paramètre dans une fonction il faut utiliser File **f ???

    Merci beaucoup de ton aide en tout cas !
    This is NOT my boyfriend's computer.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 07/10/2010, 20h16
  2. problème d'affichage avec les structures
    Par jlion5 dans le forum C
    Réponses: 1
    Dernier message: 03/05/2008, 13h13
  3. problème d'affichage suite a une structure
    Par clampin dans le forum Débuter
    Réponses: 4
    Dernier message: 26/12/2007, 18h00
  4. Copie de structure par pointeur - Problème LSB MSB
    Par the_ionic dans le forum Réseau
    Réponses: 4
    Dernier message: 17/07/2006, 15h08
  5. [Virtual Pascal] [WinSock] Problème d'affichage structure SERVENT
    Par Alcatîz dans le forum Autres IDE
    Réponses: 2
    Dernier message: 12/07/2005, 22h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo