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

Langage Delphi Discussion :

souci sur des pointeurs


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 98
    Points : 72
    Points
    72
    Par défaut souci sur des pointeurs
    voila j'ai un Treeview qui contient des TTreeNode;

    je voudrais passer un integer dans le node
    pour cela la seule propriétée que j'ai trouvé c'est le data, un pointeur
    >< je connais absolument pas les pointeurs mais je me suis documenter sur le net .... seulement voila >< j'ai suivi les tutos et j'ai tout de meme une violation d'acces.

    Quelqun pourrait il m'eclairer ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedureTFraParamTbl.Chargement;
    var
      Node : TTreeNode;
      Pi : ^integer;
    begin inherited create(AOwner);
     
      New(Pi);
      pi^:= 1;
      Node := TTreeNode.Create(HTMLTreeview.Items);
      Node.Data := pi ;
      HTMLTreeview.Items.Add(Node,'essai');
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TFraParamTbl.HTMLTreeviewDblClick(Sender: TObject);
    var
      Node : TTreeNode;
      i : ^integer;
      it : integer;
    begin
      inherited;
      Node := HTMLTreeview.Selected;
      ShowMessage(node.Text);
      i := Node.data;
      it := i^;  //<-- violation d'acces ici
    end;
    merci d'avance

  2. #2
    Membre régulier Avatar de Tchaill39
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 110
    Points : 70
    Points
    70
    Par défaut petite précision
    Salut !

    Juste une petite précision STP : La violation d'accès à lieu au 1° double click ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Et avec cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i := PInteger(Node.data);
    Remplace les déclaration comme par

  4. #4
    Membre régulier Avatar de Tchaill39
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 110
    Points : 70
    Points
    70
    Par défaut
    Le principe des pointeurs. C'est en gros des cases de mémoire que tu pointe avec une adresse (d'ou "pointeur") L'avantage de ces dernier est qu'au lieu de te trimbaler dans tes parenthèses un tableau monstrueux, tu peux juste prendre l'adresse. Voilà ca c'est le principe général.

    Dans ton cas : 2 choses

    - un pointeur avant d'être rempli ou utilisé doit toujours être créer avec un "New". Tu le fais dans " procedureTFraParamTbl.Chargement" mais pas dans procedure TFraParamTbl.HTMLTreeviewDblClick(Sender: TObject);

    - Un pointeur doit toujours être DETRUIT. Quand tu n'as plus besoin de l'info poointée, il faut absolument le désallouer avec la fonction "Dispose"

    Ton code correct serait donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedureTFraParamTbl.Chargement;
    var
      Node : TTreeNode;
      Pi : ^integer;
    begin inherited create(AOwner);
     
      New(Pi);
      pi^:= 1;
      Node := TTreeNode.Create(HTMLTreeview.Items);
      Node.Data := pi ;
      HTMLTreeview.Items.Add(Node,'essai');
      dispose(Pi)
    end;

    et

    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
    procedure TFraParamTbl.HTMLTreeviewDblClick(Sender: TObject);
    var
      Node : TTreeNode;
      i : ^integer;
      it : integer;
    begin
      inherited;
      New(i);
      Node := HTMLTreeview.Selected;
      ShowMessage(node.Text);
      i := Node.data;
      it := i^;  //<-- violation d'acces ici
      dispose(i)
    end;



    VOILA. Bonne continuation

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 98
    Points : 72
    Points
    72
    Par défaut
    euh ca compile pas j'ai du feinter. type incompatible (System.integer et cadraParamTbl.Integer);

    it := pInteger(node.data)^;

    mais .... j'ai tjrs une violation d'acces;


    tiens F9 ne poste pas le message ... il compile pas ? >< faut que j'arrete le delphi moi

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 98
    Points : 72
    Points
    72
    Par défaut
    >< c'est vrai j'ai pas fait de new sur le deuxieme...

    mais si le pointeur ne fait que cibler une plage memoire :
    new alloue cette plage et fait pointer le pointeur dessus
    et dispose la desalloue

    donc j'alloue la plage que dans la premiere fonction et je desalloue que lorsque je n'ai plus besoin de cette plage et non du pointeur, enfin il me semble non ? sinon entre temps j'ai perdu ma plage memoire et donc ma donnée, enfin si j'ai bien compris les tutos sur les pointeurs ^^

    enfin j'ai tester quand meme avec ta solution, et j'ai tjrs la meme erreur ... :'(


    remarque : ca plante au premier double clic

  7. #7
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    Par défaut
    Pour l'histoire du type incompatible, précise l'unité devant le type dans la déclaration, ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MaVariable : System.Integer;

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HTMLTreeview.Items.Add(Node,'essai');
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HTMLTreeview.Items.AddObject(Node, 'essai', pointer(pi));



    j'ai remplacé ton par N'oublie pas le tag résolu.

  9. #9
    Membre régulier Avatar de Tchaill39
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 110
    Points : 70
    Points
    70
    Par défaut
    Quand je regarde ton code : "Pi" et "i" sont respectivement déclarés en variable locale dans les deux fonctions. Donc tu doit les allouer en local et les désallouer en local aussi


    Si une variable doit rester entre les différentes actions : il faut la déclarer en global dans ta feuille.

  10. #10
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Ben moi je ferais comme ç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
    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
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Chargement;
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    var
      i: integer;
    begin
      with HTMLTreeView do
      begin
        for i := 0 to Items.Count - 1 do
          if Assigned(Items[i].Data) then
            Dispose(Items[i].Data);
      end;
    end;
     
    procedure TForm1.Chargement;
    var
      Node : TTreeNode;
      Pi : PInteger;
    begin
      New(Pi);
      pi^:= 1;
      HTMLTreeview.Items.AddObject(nil,'essai 1', Pi);
     
      New(Pi);
      pi^:= 2;
      HTMLTreeview.Items.AddObject(nil,'essai 2', Pi);
    end;
     
    procedure TForm1.HTMLTreeViewDblClick(Sender: TObject);
    var
      Node : TTreeNode;
      i : ^integer;
      it : integer;
    begin
      Node := HTMLTreeview.Selected;
      ShowMessage(node.Text);
      i := Node.data;
      it := i^;
      ShowMessage(IntToStr(it));
    end;
    @+ Claudius

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Oui Claudius! Caesarus a oublié le AddObject donc forcément ça marche moins bien

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 98
    Points : 72
    Points
    72
    Par défaut
    >< bon c cool ca marche ^^
    ct le addobject
    ( ou est l'utilité de passer un Node a la fonction si ce que l'on met dedans est perdu ? que ce soit pour le text ou le data ...)

    pour tchail39 >< j'avais raison ... tu confonds variable et pointeur si je fait un dispose(i) je perds la plage memoire et donc tout ce qui s'y trouve ... je recupere une valeur incohérente ...
    au passage le pointeur est un type simple donc on ne le detruit pas il s'en va tout seul comme un grand ;p c'est pas un objet ( tu detruis tes strings et tes integers ? ) en revanche il faut desalloue la plage mais seulement quand je n'ai plus besoin de l'info (la méthode de claudius est nickel et sure)

    merci tout le monde pour votre aide.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 98
    Points : 72
    Points
    72
    Par défaut
    pour le tag resolu, j'attends un peu savoir si quelqun a la réponse pour l'utilité du node en parametre de la fonction add ...

  14. #14
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par Caesarus
    pour le tag resolu, j'attends un peu savoir si quelqun a la réponse pour l'utilité du node en parametre de la fonction add ...

    Citation Envoyé par Aide Delphi
    Le noeud est ajouté comme dernier frère du noeud spécifié par le paramètre Node.
    Si tu précises Nil pour le Node, le noeud créé sera de Level 0.

    Voir également AddChildObject qui ajoute le noeud comme enfant du paramètre Node.

    @+

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 98
    Points : 72
    Points
    72
    Par défaut
    ah c'est le parent ><, autant pour moi >< du coup mon node.create ne sert a rien;

    merci pour l'info

    bon je le passe en resolu

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/05/2011, 12h46
  2. probleme sur des pointeurs de pointeurs
    Par frboyer dans le forum Langage
    Réponses: 2
    Dernier message: 14/04/2010, 18h01
  3. Soucis avec des pointeurs, des tableaux, des char*
    Par isabell3 dans le forum Débuter
    Réponses: 2
    Dernier message: 07/12/2009, 12h00
  4. soucis avec des pointeurs
    Par fabpeden dans le forum C
    Réponses: 7
    Dernier message: 14/05/2007, 14h10
  5. Transtypages sur des pointeurs de fonction
    Par gege2061 dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 05/01/2007, 15h01

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