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 :

Tableaux dynamiques de record : reinitialisation


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 174
    Points : 38
    Points
    38
    Par défaut Tableaux dynamiques de record : reinitialisation
    Bonjour,

    J'ai un soucis avec du vieux code Delphi 7 en rapport avec la réinitialisation de tableaux dynamiques de records imbriqués.
    J'ai un record TDeltaList qui contient un tableau dynamique de records TDeltaListFct, le record TDeltaList contenant lui-même un tableau dynamique de TDeltaListePar.

    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
     
    TDeltaListePar = record
                       Nom:string;
                       Valeur:Real;
                       Accessible:boolean;
      end;
     
      TDeltaListFct = record
                   ListeParam:array of TDeltaListePar;
                   MsgErreur:string[7];
                   NomFct:string;
      end;
     
      TDeltaList = record
                   NomProgramme: string[8];
                   ListeAxe:  array of string[2];
                   ListeType: array of string[2];
                   ListeFct:array of TDeltaListFct;
    end;
    Mon record TDeltaList est rempli via la lecture d'un fichier.

    Question, comment réinitialiser mon record TDeltaList (faire un RAZ) proprement sans fuites mémoire?
    Est-ce que faire le code ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    monRecord : TDeltaList;
    //ici mon code de remplissage de la structure à partir du contenu d'un fichier
    Setlength(monRecord.ListeFct, 0); 
    monRecord.ListeFct := nil;
    suffit pour libérer en cascade tous les tableaux dynamiques ?

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    L'affectation à nil se sert à rien, c'est le SetLength qui compte, les RTTI déjà en D7 faut le job pour le deux* types managés soit donc String et Array.
    Si tu as le code de l'unité System, c'est Finalize (_FinalizeArray) qui est invoqué pour libérer un tableau, soit lors du SetLength pour un tableau, soit lors la sortie de fonction sur le end; que c'est appelé automatiquement pour tous tableaux.

    Si tu es en FastMM, ne soit pas surpris que certaines valeurs sont encore lisibles, si le bloc contient encore des données d'autres variables, il n'est pas encore libéré.

    Tu fais quasiment tout en ShortString ?
    C'est pour tronquer les valeurs ?
    Sache que cela occupe plus de mémoire des ShortString[8] que de String (préfixé en interne par le compteur de référence et longueur) lorsque tout est encore vide, une fois rempli, tout dépend les données et la longueur des ShortString.



    deux* pour les types simples
    Tu as aussi le Variant et OleVariant qui sont désalloués à la fin de portée ou l'affectation à Unassigned.
    Tu as aussi le les Interface, encore un compteur de référence, là c'est l'affectation à nil qui compte, le compilateur ajouter lui-même le _Release
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 174
    Points : 38
    Points
    38
    Par défaut ShortString
    En fait, je ne suis pas l'auteur du code que je cite dans mon message initial.
    J'essaie seulement de corriger des problèmes liés au fait que les structures ne sont pas réinitialisées avant d'être réutilisées, d'où des effets de bord.
    En tout cas je note que l'affectation à nil n'est pas nécessaire.

    Citation Envoyé par ShaiLeTroll Voir le message
    L'affectation à nil se sert à rien, c'est le SetLength qui compte, les RTTI déjà en D7 faut le job pour le deux* types managés soit donc String et Array.
    Si tu as le code de l'unité System, c'est Finalize (_FinalizeArray) qui est invoqué pour libérer un tableau, soit lors du SetLength pour un tableau, soit lors la sortie de fonction sur le end; que c'est appelé automatiquement pour tous tableaux.

    Si tu es en FastMM, ne soit pas surpris que certaines valeurs sont encore lisibles, si le bloc contient encore des données d'autres variables, il n'est pas encore libéré.

    Tu fais quasiment tout en ShortString ?
    C'est pour tronquer les valeurs ?
    Sache que cela occupe plus de mémoire des ShortString[8] que de String (préfixé en interne par le compteur de référence et longueur) lorsque tout est encore vide, une fois rempli, tout dépend les données et la longueur des ShortString.



    deux* pour les types simples
    Tu as aussi le Variant et OleVariant qui sont désalloués à la fin de portée ou l'affectation à Unassigned.
    Tu as aussi le les Interface, encore un compteur de référence, là c'est l'affectation à nil qui compte, le compilateur ajouter lui-même le _Release

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

Discussions similaires

  1. De l'initialisation des tableaux dynamiques de Record
    Par metanil dans le forum Langage
    Réponses: 13
    Dernier message: 03/01/2008, 16h54
  2. Tableaux dynamiques dans un record
    Par Eric Beaumard dans le forum Delphi
    Réponses: 8
    Dernier message: 10/12/2006, 20h51
  3. [D7] Tableaux dynamiques dans un record
    Par bobby-b dans le forum Langage
    Réponses: 2
    Dernier message: 30/06/2004, 23h23
  4. Article sur les tableaux dynamiques
    Par Eric Sigoillot dans le forum Langage
    Réponses: 2
    Dernier message: 16/04/2004, 22h00
  5. [Kylix] Tableaux dynamiques sour Kylix2
    Par Krän dans le forum EDI
    Réponses: 6
    Dernier message: 07/10/2003, 14h31

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