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 :

"Opération de pointeur incorrecte" lors de l'utilisation d'un TObjectList


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 71
    Points : 59
    Points
    59
    Par défaut "Opération de pointeur incorrecte" lors de l'utilisation d'un TObjectList
    Bonjour,

    J'ai un soucis avec mon application. Lorsque je la quitte j'ai un "Opération de pointeur incorrect" qui apparait.

    Je n'ai aucun moyen de voir à quel moment cette erreur apparait.

    Si vous avez une idée pour me mettre sur la piste.

    Merci.

  2. #2
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut
    Salut,

    Tu utilises quoi comme IDE ?
    Quel est le code dans le destroy de ta form principale ?
    Quel code s'execute en faîte à la fin ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    Salut, merci de t'intéresser a mon problème.

    L'ide est code gear delphi 2007.

    Je n'ai pas fait de fonction destroy pour ma forme principale.

    Je n'arrive pas à savoir quel code s'exécute, même lorsque j'essaie de voir où se déclenche l'exception en mode debug, cela ne me renvoie pas à la ligne correspondante.

    Je ne sais pas trop comment m'y prendre.

  4. #4
    Membre éclairé
    Avatar de nostroyo
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 168
    Points : 680
    Points
    680
    Billets dans le blog
    16
    Par défaut
    As-tu des TObjectList dans ta form? Souvent cette erreur est dû à cela.

  5. #5
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut
    En effet si un TObjectList est en OwnsObject, il va chercher à libérer tout son barda... Le problème c'est que si tu as supprimé certains items, il risque de t'envoyer bouler...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    Bonjour,

    Oui effectivement j'ai bien TObjectList dans un de mes objets!

    Je me suis rendu compte ce matin que le problème venait de la destruction de celui-ci.

    Par contre je n'ai pas supprimé un des objets contenu dans le TObjectList. Je ne fais qu'en ajouter.

    Y a t'il une méthode particulière pour le détruire?

    Merci pour votre aide.

  7. #7
    Membre éclairé
    Avatar de nostroyo
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 168
    Points : 680
    Points
    680
    Billets dans le blog
    16
    Par défaut
    Si tu as construit ta TObjectList avec un create sans paramètre tu n'as pas à t'occuper de la destruction des objets à l'intérieur, c'est gérer automatiquement.

    Tu dis que tu ne fais qu'ajouter des objets à l'intérieur, mais ces objets sont-ils référencés autre part? Est-ce que tu n'affecte pas un des objets de la liste a une variable ou a une autre liste? Vérifie bien ce que tu fais de tes objets. Typiquement, un objet de la liste est déjà détruits et quand la TObjectList se détruit, au préalable, elle appelle pour chacun de ses objets le destructeurs, donc s'il y en a un ou plusieurs de déjà détruits

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    Pour pouvoir répondre a ta question il faudrait que je sache si lorsquon fait un add sur la tobjectlist l objet en paramètre de l add est copie ou si c'est le pointeur sur l'objet qui est copie. J'espère que je suis comprehensible.

    Merci pour ton aide.

  9. #9
    Membre éclairé
    Avatar de nostroyo
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 168
    Points : 680
    Points
    680
    Billets dans le blog
    16
    Par défaut
    C'est justement le pointeur qui est inséré, c'est comme ça que tu n'as pas besoin de t'occuper de la destruction des objets à l'intérieur et c'est pour cela qu'il faut faire attention à ce que tu fais de ces objets!

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    Ah !

    Donc il ya surrement soucis puisque l'objet que j'insere provient d'un thread. Il faut donc que je le copie dans un autre objet avant de l'insérer dans la liste.

  11. #11
    Membre éclairé
    Avatar de nostroyo
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 168
    Points : 680
    Points
    680
    Billets dans le blog
    16
    Par défaut
    Sinon tu construit ta ObjectList avec pour paramètre du constructeur False et tu gère toi-même la destruction de tous tes objets!

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    Résolu en mettant a false la propriété OwnsObjects et en faisant un clear avant de faire le free.

    Je peux considérer que ma mémoire est vidée?

    Merci beaucoup pour ton aide.

    Edit: Titre modifié, ca peut surement aider avec un nom plus clair.

  13. #13
    Membre éclairé
    Avatar de nostroyo
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 168
    Points : 680
    Points
    680
    Billets dans le blog
    16
    Par défaut
    Normalement tu n'as pas besoin de faire ce clear avant le free. Vérifie que tu n'as pas de memory leak, a savoir que les objets a l'interieurs de ta liste son bien détruits dans ton thread ou ailleurs!

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    Effectivement pas besoin de clear avant le free.

    Comment je peux vérifier que les objets sont correctement détruits?

  15. #15
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut
    Comment je peux vérifier que les objets sont correctement détruits?
    Je sais pas si c'est possible, car finalement ce ne sont que des pointeurs... Et ils pointront toujours vers un endroit de la mémoire... (si tu supprimes ce qu'il y'a à cet endroit, ils risquent de pointer vers nimporte quoi !)

    Mais en principe le free après le clear, ça ne change rien ? Vu que free va quand même libérer tous les objets... (si OwnObjects à true)...

    Attention si tu mets OwnObjects à false, il faudra detruire tout tes TObject...

    Sinon l'histoire du thread, ne change rien je pense... Si tu utilises synchronize...

    TObjectList est il threadsafe ?

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    Hum j'ai quand meme un petit souci. Quand je lis la doc en ligne je vois :

    OwnsObjects permet à TObjectList de contrôler la mémoire de ses objets. Si OwnsObjects est à true (par défaut),

    [...]

    Appeler Clear libère tous les objets de la liste en plus de vider la liste.

    [...]

    Appeler le destructeur libère tous les objets de la liste en plus de détruire l'objet TObjectList lui-même.
    Ce qui signifie qu'en le mettant a False je ne détruis plus les objets qui sont dans la liste...
    Pourquoi j'ai donc une erreur de pointeur quand j'essaie de détruire les objets qui sont dans la liste??? Je suis certain que ces objets n'appartiennent pas au thread.

    Je ne comprends plus rien

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par remixtech Voir le message
    TObjectList est il threadsafe ?
    Oui en fait j'ai une propriété dans mon thread qui est en lecture seule qui renvoie vers l'objet que je souhaite mettre dans la liste.

    Je récupère la valeur de la propriété dans un objet puis je met cet objet dans ma liste... Un peu de code pour être plus clair

    La propriété dans mon thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    property mesures : TMesures read Fmesures;
    son utilisation dans le thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Fmesures := TMesures.Create;
    // Et je remplis les champs de Fmesure
    Utilisation de la propriété dans le "programme principal":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      mesure := GestionCamera1.mesures;
      GraphicMapping_visu.CustomObject := mesure;
    GestionCamera1 étant le nom de mon objet Thread.

    J'espere être un peu plus clair.

  18. #18
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut
    Ce qui signifie qu'en le mettant a False je ne détruis plus les objets qui sont dans la liste...
    Pourquoi j'ai donc une erreur de pointeur quand j'essaie de détruire les objets qui sont dans la liste??? Je suis certain que ces objets n'appartiennent pas au thread.

    Je ne comprends plus rien
    A false en effet tu ne détruis plus rien du tout !

    A false tu as une erreur de pointeur, je n'ai pas tout suivi, en principe tu dois avoir une erreur de pointeur à true pas à false ?

    Par contre ton histoire de thread est confuse, une TObjectList n'appartient pas à un thread, ce sont deux choses différentes...

    Bon alors, maintenant ton code...
    je ferai

    Dans l' Application_principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     var monobjectlist:TobjectList;
     
    monobjectlist := tobjectlist.create; // debut execution
    .....
    ....
    ...
    ...
    monobjectlist.free; // fin execution
    Dans le thread :

    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
    var monobjet:tobject;
    
    procedure thread .execute : 
    monobjet := tobject.create;
    monobjet.propriete := 'tatatitite';
    monobjet.ident := 5545;
    ...
    ...
    synchronize(synchronisatio_des_deux); // on synchronize le thread avec l'execution principale
    //Attention tu ne le détruis pas
    
    procedure thread .synchronisatio_des_deux : 
    begin
    application_principale.monobjectlist.add(monobjet);
    end;

    Quelque chose comme ça... Le bout de code que tu donnes est trop petit pour comprendre réelement ce que tu fais...

    Bon courage

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    Oui quand je mets a true j'ai un erreur de pointeur.

    Je vais te mettre plus de code pour être plus clair. C'est ca quand on est dans son projet, on comprend tout en lisant 2 lignes ^^.

    Alors il faut que je te précise que le TObjectList appartient à GraphicMapping_visu. J'y accede par la propriété CustomObject.

    Programme principale :
    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
     
    procedure TFormPp.miseAjourAffichage(nb_traitees : Integer);
    var
      mesure : TMesures;
      nb_restantes, mesure_actuelle : Integer;
    begin
     
      // On récupère les résultats de la mesure
      mesure := GestionCamera1.mesures;
      GraphicMapping_visu.CustomObject := mesure;
     
    // ICI J'UTILISE mesure
     
      // On met à jour le compteur de cellules
      nb_restantes := nb_cellules - nb_traitees;
      Frame_principale.Panel_restantVisu.Caption := inttostr(nb_restantes);
     
      Application.ProcessMessages;
    end;
    Toujours dans le programme principal, la fonction suivante boucle et se synchronise avec le thread:
    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
    procedure TFormPp.mesuresVisu;
    var
      loop,loop2,loopCoord,nb_traitees: integer;
      Coord: TTab_Coord;
      premiere_boucle: boolean;
    begin
      // On lance le thread
      GestionCamera1.Resume;
     
      nb_traitees := 0;
     
      // Indique qu'on est dans la premiere boucle
      premiere_boucle := True;
     
      for loop2 := 0 to GraphicMapping_visu.CountEmplacementPlateau - 1 do
      begin
        for loop := 0 to GraphicMapping_visu.CountEmplacementModule -1 do
        begin
          // On attend la fin des mesures
          FEventFinMesures.WaitFor(INFINITE);
     
    //*** Enregistrement des résultats et mise à jour de l'affichage
          if not premiere_boucle then
          begin
            inc(nb_traitees);
            miseAjourAffichage(nb_traitees);
          end;
     
    //*** Calcul de la nouvelle cellule et déplacement
          GraphicMapping_visu.EmplacementPlateau:=loop2;
          GraphicMapping_visu.EmplacementModule:=loop;
     
          // On extrait les coordonnées
          Coord:=GraphicMapping_visu.ExtractCoord(4);
     
          for loopCoord := low(Coord) to high(Coord) do
          begin
     
            // On déplace le robot sur la cellule
    //        if robot.pointApoint(coord[loopCoord].X + 88.34, 483.25 - coord[loopCoord].Y, 0, 0) then
              // On active le thread Camera
              FEventFinDeplacement.SetEvent;
     
            premiere_boucle := False;
          end;
        end;
      end;
     
      Inc(nb_traitees);
      miseAjourAffichage(nb_traitees);
     
      GestionCamera1.stopThread;
     
    end;
    Voila pour la partie programme principal. Maintenant le thread:

    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
    procedure TGestionCamera.Execute;
    Var
      nb_scenes : Byte;
      resultatsMesures : TTableauDouble;
      scene_actuelle, mesure_actuelle, parametre_actuel: Integer;
      test : Integer;
    begin
      nb_scenes := Length(tableauScenes);
      test := 1;
      repeat
        // On charge la scène
    //    camera.numScene := tableauScenes[0].numScene;
     
        // On attend la fin du déplacement (message du robot)
        FEventFinDeplacement.WaitFor(INFINITE);
     
        Fmesures := TMesures.Create;
        mesure_actuelle := 0;
     
        for scene_actuelle := 0 to length(tableauScenes) - 1 do
        begin
          with tableauScenes[scene_actuelle] do
          begin
            resultatsMesures := nil;
            // On prend les mesures
            resultatsMesures := camera.acquisitionEtMesure;
     
            //On enregistre les mesures dans l'objet -> que je vais mettre dans le TObjectListe
            with Fmesures do
            begin
              // On parcours le tableau de paramètre pour récupérer l'id_mesure et la position dans la trame
              for parametre_actuel := 0 to length(tabParametre) - 1 do
              begin
     
                // On agrandie le tableau contenant la data
                SetLength(tabMesuresVisuels, length(tabMesuresVisuels) + 1);
     
                with tabParametre[parametre_actuel] do
                begin
                  // On enregistre l'id_mesure
                  tabMesuresVisuels[mesure_actuelle].idMesure := idMesure;
     
                  // On enregistre la valeur mesurée
                  tabMesuresVisuels[mesure_actuelle].valeurMesuree := resultatsMesures[positionTrame];
     
                  // On met a jour l'état des specs
                  with tabMesuresVisuels[mesure_actuelle] do
                  begin
                    limitesOK := (valeurMesuree > limites.specMin) and (valeurMesuree < limites.specMax);
                  end;
     
                end;
     
                // On incrémente le nombre de mesures effectuées
                Inc(mesure_actuelle);
     
              end;
            end;
          end;
     
          // On charge la scène suivante s'il y en a une
          if (scene_actuelle + 1) < nb_scenes then
    //        camera.numScene := tableauScenes[scene_actuelle + 1].numScene;
        end;
     
        // On informe le robot de la fin de la mesure
        FEventFinMesures.SetEvent;
     
        Inc(test);
      until Terminated;
     
    end;
    Voila si ca peut t'aider un peu plus.

    Merci encore.

  20. #20
    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 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    si j'ai bien compris :
    - GraphicMapping_visu.CustomObject est un TObjectList
    - auquel tu associe un TMesures (GraphicMapping_visu.CustomObject := GestionCamera1.mesures

    TMesures est-il bien un descendant de TObjectList ?

    où détruis-tu ta liste ? dans le thread où elle est créée, ou dans la fiche d'affichage ?

    dans le code que tu montres, je ne vois aucun TMesures.Add(qqch) mais juste une utilisation de tableaux dynamiques
    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 !

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

Discussions similaires

  1. Opération de pointeur incorrect
    Par BuzzLeclaire dans le forum Langage
    Réponses: 10
    Dernier message: 26/05/2011, 01h20
  2. Opération de pointeur incorrecte
    Par colorid dans le forum Langage
    Réponses: 6
    Dernier message: 26/07/2010, 18h08
  3. "Opération de pointeur incorrect"
    Par Sancha dans le forum Langage
    Réponses: 5
    Dernier message: 18/11/2009, 12h33
  4. Opération de pointeur incorrecte au Raise d'une exception
    Par stanislas dans le forum Débuter
    Réponses: 5
    Dernier message: 24/06/2009, 11h11
  5. Message d'erreur 'opération de pointeur incorrecte'
    Par Clotilde dans le forum Langage
    Réponses: 3
    Dernier message: 05/06/2008, 09h40

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