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

 Delphi Discussion :

arbre n-aire, probleme de code


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2008
    Messages : 8
    Points : 7
    Points
    7
    Par défaut arbre n-aire, probleme de code
    bonjour à tous,
    j'aurais besoin d'aide pour creer un arbre n-aire afin d'implementer un dictionnaire de mot mais malheureusement, mon code ne fonctionne pas à l'execution .
    J'aimerai un peu d'aide de votre part afin de pouvoir corriger cette erreur merci d'avance,
    un bon moment à tous dans l'attente d'une réponse.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
    type
     
            tree = ^Noeud;
            Noeud = record
                    Fils    : array['A'..'Z'] of tree;  //liste de fils
     
                    Lettre  : char ;       // lettre contenue dans ce noeud de l'arbre
                    Entier  : boolean;     //flag indiquant si le mot est entier
                    end; { Noeud }
     
     
     
    var
      Form1: TForm1;
      arbre,tete,courant:tree;
     
     
    implementation
     
    {$R *.dfm}
    procedure createtree(a:tree);   //construit les feuilles de l'arbre
    var c : char ;
     
    begin
    new(a);
    for c:='A' to 'Z' do
    a^.Fils[c]:=nil ;
    a^.Lettre:=#0 ;
    a^.Entier:=false ;
    end ;
     
    procedure createarbre(var tete : tree) ;
    begin
    tete:=nil;
    end ;
     
     
    procedure rajouter_mot(LeMot : string) ;
    var lettre : char ;
    var temp : tree;
    begin
    if LeMot='' then
       begin
       courant^.Entier:=true;
       exit ;
       end;
    lettre:=LeMot[1] ;
     
    if courant^.fils[lettre]<>nil then  // si la lettre existe déjà
       courant:=courant^.fils[lettre]   // alors on se positionne sur la lettre suivante
    else  // sinon il faut créer cette lettre dans l'arbre
       begin
       createtree(courant^.fils[lettre]) ;
       courant:=courant^.fils[lettre] ;
       courant^.lettre:=lettre ;  // la lettre est maintenant dans l'arbre
       end ;
    delete(LeMot,1,1) ;  // on efface la lettre du mot puisqu'elle est déjà dans l'arbre
    rajouter_mot(LeMot) ; // et on rajoute le reste
     
    end ;
     
     
     
    procedure chargerarbre(NomFic : string) ;
    var   s,chemin : string ;
           f : textfile ;
    begin
    // chargement du dico
    chemin:=ExtractFilePath(Application.ExeName); {le chemin de l'appli, AVEC l'antislash final }
    assignFile(f,chemin+nomFic) ;
    reset(f) ;
    repeat
        readln(f,s) ;
        courant:=tete ;  // on se positionne en tête de l'arbre
        rajouter_mot(s) ;  // et on rajoute le mot
    until eof(f) ;
    closeFile(f) ;
    end ;
     
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    createarbre(arbre);
    chargerarbre('dico1.txt') ;
     
    end;
     
    end.

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 435
    Points : 5 848
    Points
    5 848
    Par défaut
    salut

    recherche l'unitée OStringTree


    @+ Phil

  3. #3
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Je te conseille ce tuto :
    http://users.iafrica.com/d/da/dart/z.../TreeView.html
    bonne chance..

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Tient, j'ai fait ceci très rapidement récemment, c'est aussi un arbre pour associer un mot avec un objet (ça peut-être utile pour un mot et une définition par exemple)
    Etudie surtout la récursivité de AddCode et de FindCode

    Regarde ma classe TTreeHashingObjectList dans ce sujet , j'y ai mis l'ensemble de mon unité uHastList, bon ce n'est pas vraiement des tables de Hashage mais des tableaux associatifs ou un arbre ...

    ça s'utilise comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     TreeHashingTable['clé'] := objet; // insert ou update
     variable := TreeHashingTable['clé']; // récupération
    utilse la balse [ CODE] (le # dans la barre)

    Sinon, évite les variables globales tu n'y arrivera pas, ton code n'est pas assez réfléchi, le code récursif est difficile a écrire parfois, tu devrais poser sur papier avant d'écrire du code, et surtout met le dans une unité séparé d'une Form !

  5. #5
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Bon je vois plusieurs choses douteuses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure createarbre(var tete : tree) ;
    begin
    tete:=nil;
    end ;
    Tu as un paramètre tete et une variable globale tete.
    Ici, c'est le paramètre que tu affectes à nil et ta variable globale n'est pas initialisée.
    Dans chargerarbre, tu affectes courant à la variable globale tete. Mais tete n'a jamais été initialisée...
    De plus, tu as définis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure createtree(a:tree);   //construit les feuilles de l'arbre
    var c : char ;
     
    begin
    new(a);
    for c:='A' to 'Z' do
    a^.Fils[c]:=nil ;
    a^.Lettre:=#0 ;
    a^.Entier:=false ;
    end ;
    Est-ce qu'il ne manquerait pas un var dans la déclaration du paramètre ?
    Lorsque tu fais le new, un élément noeud est bien créé et initialisé. Cependant, la valeur du pointeur ne sera pas transmise à l'appelant puisque le paramètre n'est pas en var.
    Or dans rajouter_mot tu fais appel à createtree pour définir le noeud enfant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    createtree(courant^.fils[lettre]) ;
    Mais comme le paramètre n'est pas en var, la valeur du tableau n'est pas modifiée. Tu ne récupères pas la référence créée par createtree, donc ton arbre ne se construit pas.
    Par contre, tu crées un memory leak...

    PS: c'est plutôt vieillot comme façon de coder. Il y a longtemps qu'on ne fait plus de new et de dispose en Delphi. C'est un exercice scolaire ?

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Citation Envoyé par Franck SORIANO Voir le message
    PS: c'est plutôt vieillot comme façon de coder. Il y a longtemps qu'on ne fait plus de new et de dispose en Delphi. C'est un exercice scolaire ?
    Moi, j'en fait très souvent pour mettre de record dans les Data de TTreeView ou encore pour Pack\UnPack de message entre applicatif via TCP\IP, ou encore pour allouer un pointeur pour un appel de DLL necessitant un pointeur de pointeur sur record (même si l'on peut l'écrire en déclarant le paramètre en var), ...

    Sinon, pour la problématique d'arbre, l'objet fait merveille ... d'ailleurs ça ce justement avec le TTreeNode ou ma classe TTreeHashingObjectList

  7. #7
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Moi, j'en fait très souvent pour mettre de record dans les Data de TTreeView ou encore pour Pack\UnPack de message entre applicatif via TCP\IP, ou encore pour allouer un pointeur pour un appel de DLL necessitant un pointeur de pointeur sur record (même si l'on peut l'écrire en déclarant le paramètre en var), ...
    C'est vrai. Moi je fais ce genre de chose avec GetMem et FreeMem.

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    L'avantage du New, c'est que cela gère le SizeOf à ta place, et j'aime aussi le fort typage des pointeurs ...
    J'utilise GetMem\FreeMem pour les PChar ou lorsque la taille alloué est "provisionnelle" aussi dans le cas de communication TCP\IP, j'alloue un buffer pour récupérer la trame, et ensuite je ferais du transtypage ou une allocation de pointeur typé via new pour placer les messages dans une file d'attente ... tient d'ailleurs, TList ou TThreadList, je les ai toujours utilisé avec New\Dispose, je n'ai jamais mis d'objet dedans ...

    A part ça, la_star160, tu ne réponds pas à nos propositions !?

Discussions similaires

  1. [VB.Net] Probleme popup code behind
    Par balibo dans le forum ASP.NET
    Réponses: 19
    Dernier message: 17/10/2005, 12h22
  2. construire un arbre n-aire
    Par emidelphi77 dans le forum Langage
    Réponses: 2
    Dernier message: 11/10/2005, 18h47
  3. probleme de code formulaire
    Par bachilbouzouk dans le forum ASP
    Réponses: 45
    Dernier message: 13/04/2005, 10h01
  4. arbre n-aire delete
    Par Fry dans le forum C++
    Réponses: 13
    Dernier message: 19/10/2004, 21h22
  5. [debutant] probleme de code :-(
    Par flogreg dans le forum Servlets/JSP
    Réponses: 14
    Dernier message: 16/08/2004, 18h20

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