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 :

TObjectlist -> objets déréférencés


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut TObjectlist -> objets déréférencés
    Salut à tous,

    Je viens vers vous car j'ai un problème de déréferencement de pointeur sur mes objets de ma TObjectList. Je m'explique :

    Je dispose :

    D'une classe mère TSurveillance instanciant deux TobjectList FListe_Definition : TObjectList;
    FListe_Defauts : TObjectList;

    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
     
    TSurveillance = class(TObject)
      private
        { Déclarations privées }
        Function TickToDate(const _Tick : cardinal) : String;
     
      protected
        { Déclarations protégées }
        FListe_Definition : TObjectList;
        FListe_Defauts : TObjectList;
     
        Procedure Set_Liste_Definition(_Liste_Definition : TObjectList); virtual;
        Procedure Set_Liste_Defauts(_Liste_Defauts : TObjectList); virtual;
        Procedure Gerer_Redondance (_Resultat_Surveillance : TResultat_Surveillance); virtual;
     
      public
        { Déclarations publiques }
        Constructor Create; overload; virtual;
        Constructor Create(_Liste_Definition : TObjectList); overload; virtual;
        Destructor Destroy; override;
     
        Property Liste_Definition : TObjectList read FListe_Definition write Set_Liste_Definition ;
        Property Liste_Defauts : TObjectList read FListe_Defauts write Set_Liste_Defauts ;
     
        // Fonctions d'accès à la liste des défauts
        Procedure Reset_Liste_Defauts ;
     
      end;
    D'une classe descendante de TSurveillance s'intitulant TSurveillance_Arinc429

    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
      TSurv_ARINC429 = class(TSurveillance)
      private
        { Déclarations privées }
     
      protected
        { Déclarations protégées }
     
      public
        { Déclarations publiques }
        Conforme : Boolean;
     
        Constructor Create; Override;
        Constructor Create(_List_Def_Arinc : TObjectList); Overload; Override;
        Destructor Destroy; Override;
    ...
    Le soucis apparait dans chaque fonction utilisées de la classe TSurveillance_Arinc429. Par exemple celle-ci :

    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
    Function TSurv_ARINC429.Surv_Data_Max(_Label, _Data32b, _Borne_Sup: Cardinal) : Boolean;
    Var
    	Index : Integer;
      Donnee : Cardinal;
      Resultat_Arinc429 : TResultat_Arinc429 ;
     
    Begin
     
      Result := True ;
     
     // On parcourt le tableau de définitions de labels Arinc
      For Index := 0 To Liste_Definition.Count - 1 Do
     
      	// Si le label est trouvé et que l'on trouve la donnée à surveiller alors
    		If TDEF_ARINC429(Liste_Definition.Items[Index]).Label_Arinc = _Label Then
        Begin
     
        	// On récupère le LSB et le MSB de la donnée à évaluer nécessaire au masque
          Donnee := Get_Masked_Data(_Data32b,TDEF_ARINC429(Liste_Definition.Items[Index]).LSB_Data, TDEF_ARINC429(Liste_Definition.Items[Index]).MSB_Data);
          // On teste si la donnée est bien dans l'intervalle de tolérance
          If Donnee > _Borne_Sup Then
          Begin
            Result := False ;
          	Resultat_Arinc429 := TResultat_Arinc429.Create(TDEF_ARINC429(Liste_Definition.Items[Index]).Cle, False, TDEF_ARINC429(Liste_Definition.Items[Index]).Code_Defaut, Format(S_DEFAUT_BORNE_SUP_A429, [TDEF_ARINC429(Liste_Definition.Items[Index]).DataName, _Label, _Borne_Sup, Donnee]))
          End
          Else Resultat_Arinc429 := TResultat_Arinc429.Create(TDEF_ARINC429(Liste_Definition.Items[Index]).Cle, True, TDEF_ARINC429(Liste_Definition.Items[Index]).Code_Defaut, '');
     
          Gerer_Redondance(Resultat_Arinc429) ;
     
          Resultat_Arinc429.Free ;
     
    		End;
     
    End;
    La fonction Gerer_Redondance permet de maintenir une liste d'objets de type TResultat_Arinc429. Resultat_Arinc429 est passé en paramètre d'entrée par copie. Cette fonction appartient à la classe générique TSurveillance.

    Lorsque je fais Resultat_Arinc429.Free, il me détruit également l'objet passé par copie et présent dans la liste d'objets, or je souhaite qu'il soit gardé !
    J'ai essayé pas mal de solutions, à savoir mettre OwnsObject à false sur la variable FListeDefauts mais rien n'y fait

    J'espère avoir été assez clair. Si quelqu'un à une idée d'où vient mon problème, j'attends avec impatience vos propositions...

    Merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    ben c'est normal

    les objets Delphi sont implicitement des pointeurs, dans ton code tu crées une instance de l'objet puis tu le détruis. Si ce pointeur a été placé dans une liste, l'objet pointé est le même ... c'est donc celui qui est détruit.

    pour "copier" l'objet, il faut créer une nouvelle instance et recopier chaque membre de l'objet dans la nouvelle instance.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Candidat au Club
    Inscrit en
    Avril 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Salut !

    Merci d'accorder de votre temps à mon probleme

    Je croyais que l'objet Resultat_Arinc429 était copié lors de l'appel de la fonction Gerer_Redondance. A l'inverse, un passage par adresse se fait bien avec un prototypage "var", non ?:
    function Gerer_Redondance(var _Resultat_Surveillance : TResultat_Surveillance) : Boolean ;

    Ca veut dire que dans mon cas, je dois créer une copie de l'objet dans la fonction Gerer_Redondance ?

  4. #4
    Candidat au Club
    Inscrit en
    Avril 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Effectivement, j'ai créé une nouvelle instance d'objet TResultat_Arinc429 dans la fonction appelée Gerer_Redondance. La copie de l'objet présente dans la TObjectList est bien maintenue

    Maintenant, il va falloir m'expliquer l'interet d'un passage de paramètres par copie , s'il faut créer à chaque fois une copie locale ! Je ne vois plus la différence par rapport à un passage par adresse

    Merci

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 744
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 744
    Points : 13 303
    Points
    13 303
    Par défaut
    Il faut séparer les deux choses: la mémoire allouée à la création de l'objet et le pointer sur cette adresse mémoire.

    Comme a dit Paul Toth, c'est le pointer que tu passes en paramètre et qui sera copié ou non en fonction de la déclaration. L'allocation sous-jacente n'est pas affectée.

    Dans ton cas, il suffit de supprimer la ligne Resultat_Arinc429.Free puisque c'est la TObjectList de destination qui se chargera de sa destruction. Dupliquer l'objet n'est pas nécessaire.

  6. #6
    Candidat au Club
    Inscrit en
    Avril 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour ces précisions,

    J'ai géré la destruction de Resultat_Arinc429 dans la fonction Gerer_Redondance.
    Ca marche au poil

    Merci à tous et à bientot...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/05/2007, 20h43
  2. Utilisation de Sort d'un Objet TObjectList
    Par ero-sennin dans le forum Delphi
    Réponses: 7
    Dernier message: 19/04/2007, 13h11
  3. création d'un objet dans un Tobjectlist
    Par niarkyzator dans le forum Delphi
    Réponses: 2
    Dernier message: 07/01/2007, 20h47
  4. TObjectList et libération des objets
    Par eponette dans le forum Delphi
    Réponses: 9
    Dernier message: 04/01/2007, 11h16
  5. Cast d'un objet d'une TObjectList
    Par maredami dans le forum Langage
    Réponses: 21
    Dernier message: 23/03/2006, 16h16

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