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 :

Type file qui refuse d'enfiler et erreur de pointeur...


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 79
    Points : 56
    Points
    56
    Par défaut Type file qui refuse d'enfiler et erreur de pointeur...
    Bonjour, voila, j'essaye de faire une file de boutons (file comme la queue leu-leu hein, pas le file comme un faille-leu ), j'ai donc défini le type non sans m'aider des formidables tutos de fbeaulieu par ailleurs, mais comme je ne veux pas faire une file de TPersonnes, mais une file de TMenuBoutons (qui sont comme leur nom l'indique subtilement, des boutons d'un menu).

    Bref, avec le debugger j'ai l'impression que tout se passe bien jusqu'à l'opération Enfiler, qui pose un petit problème.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // le type File
        type
          PFileElem = ^TFileElem;
          TFileElem = record
            Elem : TMenuBouton;
            Suivant : PFileElem;
        end;
    Version colorée

    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
     
    // la fonction enfiler
      function FLEnfiler(F : PFileElem; B : TMenuBouton ) : PFileElem; 
      var
        tmp, parcours : PFileElem;
      begin
        new(tmp); // hop on cré le pointeur
        tmp^.suivant:= nil; // on initialise le pointeur de la variable ajoutée
        tmp^.Elem:= B; // on initialise la valeur de la variable ajoutée
     
        if F = nil then // si F est vide, on retourne directement ce qu'on ajoute 
        begin
          result:= tmp; 
        end
        else // sinon
        begin
          parcours:= F; // parcours servira à parcourir la file (héhé)
          while parcours^.suivant <> nil do // tant qu'on n'a pas atteint la fin de la file
          begin
            parcours:= parcours^.suivant; // on va à l'élément suivant
          end; // on est au bout de la vile
          parcours^.suivant:= tmp;  // on fait que le pointeur pointe vers la variable qu'on veut ajouter
          result:= F; // on retourne F
        end;
      end;
    version colorée

    Ce code vient bien sur de celui qui se trouve sur la page de fbeaulieu

    Ensuite je veux utiliser cette fonction pour enfiler des TMenuBoutons dans une file qui se trouve dans la classe TFiledeboutons.

    voila en gros mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // la classe TFiledeboutons
        type
          TFiledeboutons = class
          public
             constructor Init;
             procedure afficher;
             procedure ajouter(width, height, x, y : integer; transparence : double; couleur : string);
     
          private
             Elts : PFileElem;
     
          end;
    version colorée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      procedure TFiledeboutons.ajouter(width, height, x, y : integer; transparence : double; couleur : string);
      var
        tmp : TMenuBouton;
      begin
        tmp:= TMenuBouton.Create(width, height);
        tmp.x:= x;
        tmp.y:= y;
        tmp.SetButtonTransparence(transparence);
        tmp.SetButtonColor(couleur);
        Elts:= FLEnfiler(Elts, tmp);
      end;
    version colorée

    Donc voila, dans le code, tout d'abord j'initialise l'objet boutons (de classe TFiledeboutons)
    puis j'ajoute un TMenuBouton, puis je l'affiche.
    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
     
    program interface;
     
    {$APPTYPE CONSOLE}
     
    uses
      SysUtils,
      OpenGL,
      glfw,
      Unit1 in 'Unit1.pas',
      Unit2 in 'Unit2.pas';
     
    var
      running : boolean;
      boutons : TFiledeboutons;
     
    {... qqes fonctions et procédures ...}
      procedure  Display;
      begin
        glClear(GL_COLOR_BUFFER_BIT);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity;
        glEnable(GL_BLEND) ;
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;
     
     
        boutons.afficher;
        glDisable(GL_BLEND);
        glFlush;
        glfwSwapBuffers;
      end;
     
    { ... encore d'autres fonctions et procédures ...}
    begin
    {... initialisations diverses et variées ...}
     
      boutons:= TFiledeboutons.Init;
      { début de l'ajoutage de boutons }
        boutons.ajouter(300, 30, 50, 50, 0.5, 'red');
      while running do
      begin
        Display; 
     
        running:= (glfwGetKey(GLFW_KEY_ESC) = 0) and (glfwGetWindowParam(GLFW_OPENED) = 1);
      end;
      glfwTerminate;
    end.
    Version colorée

    la fonction qui est sensée afficher tous les boutons de la file:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      procedure TFiledeboutons.afficher;
      var
        tmp : PFileElem;
      begin
        tmp:= Elts;
        while tmp <> nil do
        begin
          FLTete(tmp).Display(FLTete(tmp).x, FLTete(tmp).y);
          FLDefiler(elts);
        end;
        dispose(tmp);
      end;
    version colorée

    et la fonction qui est sensée ajouter un bouton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      procedure TFiledeboutons.ajouter(width, height, x, y : integer; transparence : double; couleur : string);
      var
        tmp : TMenuBouton;
      begin
        tmp:= TMenuBouton.Create(width, height);
        tmp.x:= x;
        tmp.y:= y;
        tmp.SetButtonTransparence(transparence);
        tmp.SetButtonColor(couleur);
        Elts:= FLEnfiler(Elts, tmp);
      end;
    version colorée

    Donc voila, quand je compile, ça me donne "Project interface.exe raised exception class EInvalidPointer with message 'Invalid Pointer Operation'. Process stopped. Use step or Run to continue.".
    J'avoue que j'ai débuté hier avec les pointeurs, et qu'il est possible que j'ai fait une fausse opération quelquepart, seulement mon manque d'expérience m'a empéché de trouver l'erreur, même avec le debugger (quoi qu'il m'a permis de supposer que l'erreur se trouve aux alentours de la fonction d'enfilement).

    Donc si quelqun avait une idée d'où provient l'erreur, et surtout de comment la supprimer, je suis preneur
    Si jamais il manque un bout de code ou quoi que ce soit, n'hésitez pas à me demander.

    Merci d'avoir pris le temps de me lire.

    iLUV

  2. #2
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Ce qui me gène, c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      procedure TFiledeboutons.afficher; 
      var 
        tmp : PFileElem; 
      begin 
        tmp:= Elts; 
        while tmp <> nil do 
        begin 
          FLTete(tmp).Display(FLTete(tmp).x, FLTete(tmp).y); 
          FLDefiler(elts); 
        end; 
        dispose(tmp); 
      end;
    Moi, je mettrais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      procedure TFiledeboutons.afficher; 
      var 
        tmp : PFileElem; 
      begin 
        tmp:= Elts; 
        while tmp <> nil do 
        begin 
          FLTete(tmp).Display(FLTete(tmp).x, FLTete(tmp).y); 
          tmp:= FLDefiler(tmp); 
        end; 
      end;
    J'ai récupéré la nouvelle valeur après le défilement (sur tmp non ???), et je ne dispose pas tmp, car sinon, tu disposes Elts par la même occasion.
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 79
    Points : 56
    Points
    56
    Par défaut
    ouais ^^ maintenant que tu le dis ça semble terriblement logique, et je me sens terriblement pas futé...

    Et puis j'avais un peu oublié de tenir compte que defiler était une fonction :/ comme en cours d'algo on utilisait déjà la fonction défiler (mais en statique) et qu'on l'avait fait avec une procedure et une variable globale, j'avais rien à récupérer, reflexe idiot.

    Par contre ça ne résout pas mon problème (mais ça m'en résout un autre par avance), je pense que ça n'atteignait même pas l'affichage de la file en fait, ça plante avant (surement au niveau de l'ajout d'un bouton).

    En tout cas je te remercie MD Soft

  4. #4
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Quand tu fais du pas à pas, il bloque sur quelle ligne ?
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 79
    Points : 56
    Points
    56
    Par défaut
    Apparemment ça plante sur un défiler,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      function FLDefiler(F: PFileElem) : PFileElem;
      begin
        if F <> nil then
        begin
          result:= F^.suivant;
          dispose(F);
        end
        else result:= F;
      end;
    Quand ça fait dispose(F), mais pas au premier passage. Il y a aussi une chose que je ne comprend pas, c'est pourquoi il fait trois passage sur tete, alors qu'il n'y a qu'un seul bouton dans la file...

    Peut être vaut il mieux que je fournisse tout le code, donc le voici

  6. #6
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Dipose fait juste un dispose, pas un passage à nil.
    Ajoute après ton dispose un F := nil;
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 79
    Points : 56
    Points
    56
    Par défaut
    ça ne change rien, l'erreur est bien _sur_ l'apel sur dispose, et donc ça n'atteint pas le F:=Nil.

    Et puis dans ce code j'ai en fait un peu de mal à voir pourquoi ajouter un F:= nil après puisque je n'en ai plus besoin (ce n'est pas un while, mais un if et le result est envoyé juste avant), et qu'on finit bien par arriver à un nil en faisant: result:= F^.suivant;


    Par contre, en mettant en commentaire le dispose(F), ça fonctionne, le problème est donc bien sur ce dispose.

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 300
    Points
    11 300
    Billets dans le blog
    6
    Par défaut
    dans mon delphi, Unit Cntnrs (?), il y a les types TQueue (FIFO) et TStack(LIFO), bien pratiques...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  9. #9
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Pardon, j'avais pensé while.
    Heu ... question, tu as bien vérifié ta répartition new/dispose ?

    Citation Envoyé par tourlourou
    dans mon delphi, Unit Cntnrs (?), il y a les types TQueue (FIFO) et TStack(LIFO), bien pratiques...
    Tout à fait, mais je pense qu'il doit vouloir coder lui même sa file (c'est un bon exercice sur les pointeurs)
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 79
    Points : 56
    Points
    56
    Par défaut
    oui, je veux la coder moi meme, (et puis ils ne seraient pas un peu statiques ces TQueu et TStack?)

    Par contre dans l'oreillette on me dit que le problème vient peut etre du fait que je defait ma file à la premiere itération, et que du coup apres je dispose quelquechose qui n'existe pas.

    Enfin, si vous avez jetté un oeil sur la source complète, j'utilisait ma file comme une variable statique, et je pensais qu'en passant en paramètre, ca modifiait "une autre variable", fin bref, je ne suis pas encore bien adapté aux pointeurs

    merci pour les conseils, ça fonctionne maintenant (je met mon dispose dans mon TFiledeboutons.Destroy maintenant).

  11. #11
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Je te rappelle une règle qui n'admet par d'exception :
    Dans un programme, il doit y avoir autant de new que de dispose.
    Tu fais des new dans FLEnfiler, donc tu dois avoir autant de dispose que d'appel à FLEnfiler. Si ce n'est pas le cas, ça va pas, même si tu as l'impression que ça marche.
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 79
    Points : 56
    Points
    56
    Par défaut
    oui, je fais un new à chaque fois que j'enfile un bouton.

    Donc si j'enfile 3 boutons j'aurais 3 new.

    Mais si je les dispose, je serais obligé de refaire ma file au prochain tour, ce qui fait que je ferais et deferais ma file 3 fois par tour (2 fesages et 1 defesage), ce qui niveau complexité est un peu limite.

    Par contre quand je n'aurais plus besoin de l'objet de classe TFiledeboutons, je detruirais la liste, et donc avec fldestroy:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      procedure FLDestroy(F: PFileElem);
      var
        tmp, tmp2 : PFileElem;
      begin
        tmp:= F;
        while tmp<>nil do
        begin
          tmp2:= tmp^.suivant;
          dispose(tmp);
          tmp:= tmp2;
        end;
    je supprimerais tous les élements (donc les trois boutons) avec 3 dispose au moment ou j'apellerais boutons.destroy (qui supprimer l'objet de classe TListedeboutons), enfin, je pense que c'est ça, si je me trompe merci de me l'indiquer.

  13. #13
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Citation Envoyé par iluv
    Mais si je les dispose, je serais obligé de refaire ma file au prochain tour
    Non
    Citation Envoyé par iluv
    Par contre quand je n'aurais plus besoin de l'objet de classe TFiledeboutons, je detruirais la liste, et donc avec fldestroy:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      procedure FLDestroy(F: PFileElem);
      var
        tmp, tmp2 : PFileElem;
      begin
        tmp:= F;
        while tmp<>nil do
        begin
          tmp2:= tmp^.suivant;
          dispose(tmp);
          tmp:= tmp2;
        end;
    je supprimerais tous les élements (donc les trois boutons) avec 3 dispose au moment ou j'apellerais boutons.destroy (qui supprimer l'objet de classe TListedeboutons), enfin, je pense que c'est ça, si je me trompe merci de me l'indiquer.
    C'est une solution. Mais, tu es sûr que ton paramètre passé à FLDestroy est bien la liste avec tous les éléments. Car il me semble que à chaque appel à FLDefiler, tu perds l'accès à un élément de ta liste.
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  14. #14
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Moi aussi je rajouterais le F := nil; après le dispose, parce que :

    1) ça ne mange pas de pain.
    2) au premier passage, pas de problèmes, mais au second si puisque F<>nil, d'où dispose de F qui a déjà été détruit, d'où plantage...
    Bidouilleuse Delphi

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 79
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par waskol
    Moi aussi je rajouterais le F := nil; après le dispose, parce que :

    1) ça ne mange pas de pain.
    2) au premier passage, pas de problèmes, mais au second si puisque F<>nil, d'où dispose de F qui a déjà été détruit, d'où plantage...
    euh, oui, mais non, déjà le dispose n'existe plus, il est ailleurs dans le code (dans le destructeur), car _il ne faut pas que je détruise ma file_ et et de plus j'utilise ma fonction defile comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      procedure TFiledeboutons.afficher;
      var
        tmp : PFileElem;
      begin
        tmp:= Elts;
        while tmp <> nil do
        begin
          FLTete(tmp).Display(FLTete(tmp).x, FLTete(tmp).y);
          tmp:= FLDefiler(tmp);
        end;
      end;
    et si je dispose F (j'attribue F à tmp avec la fonction défiler) je n'ai plus de pointeur, dans ce cas j'attribue rien du tout à un pointeur => normal que ca plante, mais d'un autre coté si je met le F:= nil; je vais attribuer nil à tmp, du coup je sortirais de ma boucle avant d'avoir parcouru ma file (au deuxième tour).

    Corrigez moi si je me trompe.

    Autre chose, existe-t-il un logiciel ou un moyen de s'assurer qu'on ne "pollue" pas sa mémoire? (histoire de vérifier si j'oublie des dispose de ci de là).

  16. #16
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Citation Envoyé par iluv
    et si je dispose F (j'attribue F à tmp avec la fonction défiler) je n'ai plus de pointeur, dans ce cas j'attribue rien du tout à un pointeur => normal que ca plante, mais d'un autre coté si je met le F:= nil; je vais attribuer nil à tmp, du coup je sortirais de ma boucle avant d'avoir parcouru ma file (au deuxième tour).

    Corrigez moi si je me trompe.
    Je crois que je te suis plus.

    Citation Envoyé par iluv
    Autre chose, existe-t-il un logiciel ou un moyen de s'assurer qu'on ne "pollue" pas sa mémoire? (histoire de vérifier si j'oublie des dispose de ci de là).
    MemCheck
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  17. #17
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Je crois que tu n'as absolument pas compris ce qu'était un pointeur...

    Un pointeur c'est une variable qui contient une adresse.

    Lorsque tu effectues un dispose, ça ne détruit pas le pointeur mais la variable située à l'adresse que contient le pointeur. et là ça change tout...

    En effet, ça veut dire qu'un pointeur, tout comme avec n'importe quelle variable :
    - tu peux lui assigner la valeur que tu veux quand tu veux (pas la peine de faire un new pour ça).
    - Que quand tu fait un dispose, l'adresse qu'il contient n'est pas remise à nil, donc tu peux tout à fait, après un dispose, acceder à la zone de mémoire pointée (comme ça : MonPointeur^) et y récupérer du "n'importe quoi".
    - Le pire, c'est que si tu souhaite écrire dans la zone mémoire pointée, c'est tu le peux. mais comme cette zone mémoire n'a pas été réservée par le système avec un new, il y a de fortes chance que tu te retrouve avec un Access Violation des familles.

    Je te conseilles vivement, de te pencher sur cet article de la FAQ :
    Quid des pointeurs

    ainsi que sur les autres tutos que tu pourras trouver sur le sujet.

    Bref, rajoute donc F:=nil; comme te l'a judicieusement préconisé MD Software... ça marchera beaucoup mieux...
    Bidouilleuse Delphi

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 79
    Points : 56
    Points
    56
    Par défaut
    je n'ai rien contre rajouter le F:= nil, mais je commence à douter que ce soit ce dont j'ai besoin pour mon code, car une fois que j'ai défilé, je ne peux plus récupérer mes variables pointées (avec le dispose), et pourtant j'en aurais encore besoin.

    Par contre je pense maintenant que ma méthode n'était pas bonne, pour lire les données ce que je faisait était lire, défiler, lire, défiler etc.
    Peut être devrais-je: lire, lire le suivant, lire le suivant du suivant, etc.


    Je vais refaire ma partie d'affichage.

    Merci pour vos conseils.

    edit: voila, pour ceux que ca interesse encore un peu:
    j'ai mit le F:= nil; :p
    j'ai changé l'utilisation de la fonction afficher pour qu'elle ait un fonctionnement un peu plus logique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      procedure TFiledeboutons.afficher(F:PFileElem);
      begin
        if F^.Suivant <> nil then
        begin
          FLTete(F).Display(FLTete(F).x, FLTete(F).y);
          afficher(F^.Suivant);
        end
      end;

  19. #19
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Mais ça peut pas marche ça !
    F^.Suivant contient toujours la même valeur.
    elle est infinie ta boucle ! Sauf si afficher dépile, mais dans ce cas ........
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 79
    Points : 56
    Points
    56
    Par défaut
    euh... c'est une récursion hein, la procedure TFiledeboutons.suivant et la procedure suivant sont la même; et le but n'est plus de dépiler, mais bien de parcourir, en passant F^.suivant en paramètre, on rapelle la procedure avec en paramètre le pointeur vers l'élément suivant de la pile... enfin, ça fonctionne.

    Par contre il est vrai que j'ai un problème avec la mémoire, j'ai une perte de 108ko par bouton créé selon MemCeck.


    edit: je retire ce que j'ai dit, je me sens plus débile que jamais, j'ai créé un type file, pour le parcourir comme une pile...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. affichage message d erreur à coté d'un type file
    Par intel42 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 28/06/2012, 19h10
  2. [ZF 1.11] Element file formulaire qui n'affiche pas les erreurs
    Par absot dans le forum Zend_Form
    Réponses: 3
    Dernier message: 25/11/2011, 10h52
  3. type="file" erreur si vide
    Par afrodje dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 01/04/2009, 10h24
  4. champ de type file qui se vide.
    Par Switch03 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/11/2008, 13h40
  5. [DOM] input type=file + submit() => Accès refusé
    Par cyrilc dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 31/05/2007, 15h29

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