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 :

Problèmes de pointeurs avec les arbres


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Problèmes de pointeurs avec les arbres
    Bonjour, je suis en train d'écrire les fonctions de manipulation des arbres binaires mais j'ai quelques soucis, notamment avec la fonction modifiant la racine de l'arbre.

    Voici ce que j'ai écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct Noeud
    {
            int Valeur;
            struct Noeud * fg , * fd;
    }TNoeud, * TArbre;
     
    void ModifRacine(int v, TArbre * a)
    {
            if(EstVide(*a)) (* a) = (TArbre)malloc(sizeof(TArbre));        
            (* a)->Valeur = v;
    }
    Il doit y avoir une erreur quelque part, non ?

    Merci d'avance pour votre aide !

  2. #2
    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
    Le prototype est faux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void ModifRacine(int v, TArbre * a)
    En écrivant ceci, tu ne peux pas modifier l'arbre (enfin tu peux mais les modifications ne sont pas prises en compte)...

    Il faudrait faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    TNoeud* ModifRacine(int v, TNoeud*  a)
    {
            if(EstVide(a)) 
                  a = (TArbre) malloc(sizeof(TNoeud));       
            if(a==NULL)
                  return NULL;
             a->Valeur = v;
             a->fg = NULL;
             a->fd = NULL;
            return a:
    }
    Remarques:
    - Il faut toujours tester le retour d'un malloc, c'est une erreur grave sinon
    - Ce n'est pas un bon usage de cacher des pointeurs surtout au début de l'apprentissage de la programmation, c'est souvent une source d'erreurs
    - Ta fonction EstVide devrait prendre juste un TArbre ou TNoeud* et non un TArbre*, de plus si tu fais comme on te l'apprends ta fonction dois ressembler à (avec le prototype corrigé):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int EstVide(TNoeud *r)
    {
      return (r==NULL);
    }
    Ce qui veut dire que si ta valeur est NULL, tu considères ton arbre vide, or tu faisais:

    ce qui provoquerait une erreur de segmentation....

    Jc

    EDITION: Ajout de l'initialisation de fg et fd après la remarque de TrapD

  3. #3
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Citation Envoyé par fearyourself
    En écrivant ceci, tu ne peux pas modifier l'arbre (enfin tu peux mais les modifications ne sont pas prises en compte)...

    Il faudrait faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TNoeud* ModifRacine(int v, TNoeud*  a)
    {
            if(EstVide(a)) 
                  a = (TArbre) malloc(sizeof(TNoeud));       
            if(a==NULL)
                  return NULL;
             a->Valeur = v;
            return a:
    }
    Je crois qu'il avait raison, non? C'est TArbre qui est de type pointeur.
    Il passera donc l'adresse du pointeur (un TNoeud**).

    Nas'

  4. #4
    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
    Je crois qu'il avait raison, non? C'est TArbre qui est de type pointeur.
    Il passera donc l'adresse du pointeur (un TNoeud**).
    Exact, la fonction pourrait fonctionner, je n'ai pas l'habitude de voir ça mais oui, c'est vrai...

    Par contre, sur l'appel, il faut faire attention il faudrait faire quelque chose de ce style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TNoeud *racine = NULL;
     
    ModifRacine(5,&racine);
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TArbre *racine = NULL;
     
    ModifRacine(5,racine);
    Moi j'étais parti qu'il utiliserait la 2ème solution... C'est pour ça...

    Jc

  5. #5
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    En fait perso, pour moi un arbre c un pointeur sur un noeud.

  6. #6
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut Re: Problèmes de pointeurs avec les arbres
    Citation Envoyé par thierry57
    j'ai quelques soucis, notamment avec la fonction modifiant la racine de l'arbre.

    Voici ce que j'ai écrit :

    <CODE>

    Il doit y avoir une erreur quelque part, non ?
    Quel est le problème exactement? Ton bout de code m'a l'air correct (à part les remarques faites par fearyourself concernant le malloc() ).
    Faudrait montrer un peu plus de code, genre l'appel de la fonction.

    Nas'

  7. #7
    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
    Il y a oubli de l'initialisation des fg et fd, c'est peut-être/surement pour ça que ça plante après.
    "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

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonsoir,

    honte à moi !

    Ma fonction est effetivement correcte ... j'ai juste ajouté un test pour savoir si l'allocation avait réussi.

    Les plantages étaient dûs à des utilisations illicites de mes fonctions dans le main ... Désolé de vous avoir déranger pour rien mais merci à tous pour vos conseils !

    a+

  9. #9
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 24
    Points : 35
    Points
    35
    Par défaut
    j'enchaine sur le sujet et vous expose mon probleme concernant les arbres egalement :

    Voila mon arbre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct elem{
    	char lettre;
    	struct elem* fg;
    	struct elem* fd;
    } t_noeud;
    typedef struct elem noeud;
    typedef struct elem *arbre;
    et quelques fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    boolean estvide(arbre a)
    	{return a==NULL;}
    arbre gauche(arbre a)
    	{return a->fg;}
    arbre droit(arbre a)
    	{return a->fd;}
    Je suis en train de faire un traducteur de morse :
    voila le morceux de code qui pose probleme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (mot[i]=='.') (temp=gauche(temp));
    else if (mot[i]=='-') (temp=droit(temp));
    je lis un mot lettre par lettre, si la lettre est '.' je desire descendre dans l'arbre vers la gauche, si la lettre est '-' je desire descendre dans l'arbre vers la droite

    Voila ce que m'affiche gcc : subscripted value is neither array nor pointer pour les 2 lignes ci dessus.
    ca doit etre une erreur idiote au niveau des pointeurs mais je vois pas ! merci de vos réponses.

  10. #10
    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
    Ça doit être mot[i] qui est en cause, mot c'est quoi exactement ?
    "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

  11. #11
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 24
    Points : 35
    Points
    35
    Par défaut
    j'ai déclaré mais avant de lire le mot comme ds mon 1er message je le lis depuis un fichier

    autre précision :

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par wincher
    j'ai déclaré
    Pas du C.
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 24
    Points : 35
    Points
    35
    Par défaut
    lol ^^
    serait ce plutot :
    char mot=NULL; ??
    je desire l'initialiser car je fais une concaténation apres. vous pensez que c'est ca qui a pu generer l'erreur ? :o

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par wincher
    lol ^^
    serait ce plutot :
    char mot=NULL; ??
    je desire l'initialiser car je fais une concaténation apres. vous pensez que c'est ca qui a pu generer l'erreur ? :o
    Essaye toutes les combinaisons, tu finiras par tomber sur la bonne...

    Tu veux probablement un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char mot[128] = "";
    Une révision de tes cours de C de base semble indispensable. Ca tombe bien, c'est les vacances..
    Pas de Wi-Fi à la maison : CPL

  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
    char mot=NULL; ??
    La définition de pointeur ne te dis rien? Il faudrait définir un tableau avant de se servir d'une variable comme si c'est un tableau...

    Mieux serait:

    ou une version avec allocation dynamique...

    Jc[/code]

  16. #16
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    fearyourself et Emmanuel : vous vous êtes mis d'accord pour la taille de 128 ou c'est un pur hasard ?

    Nas'

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Nasky
    fearyourself et Emmanuel : vous vous êtes mis d'accord pour la taille de 128 ou c'est un pur hasard ?
    Boaf, non. Pur hasard.

    Mais tu connais mon goût pour les 'taiiles raisonnables' et les puissances de 2...
    Pas de Wi-Fi à la maison : CPL

  18. #18
    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
    Pur hasard mais je partage les préférences pour les tailles binaires... Lorsque je créé un tableau, c'est un hasard quand ca ne tombe pas sur une puissance de 2...

    Par contre, je remarque que c'est généralement vrai pour des tableau de taille >= 64, en dessous, j'ai une tendance à estimer plus précisèment la taille nécessaire...

    Mais cette coïncidence me fait sourire...

    Jc

Discussions similaires

  1. Problème avec les arbres
    Par madjidri dans le forum C
    Réponses: 2
    Dernier message: 06/12/2007, 01h09
  2. Problème avec les arbres
    Par isoman dans le forum C
    Réponses: 6
    Dernier message: 23/02/2007, 18h51
  3. Réponses: 17
    Dernier message: 22/01/2007, 13h34
  4. problème de pointeur avec les listes chainees
    Par innosang dans le forum C
    Réponses: 9
    Dernier message: 30/12/2005, 15h46
  5. Problème de pointeur avec un TQuery
    Par Oluha dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/01/2005, 13h57

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