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

Lazarus Pascal Discussion :

TList : Segfault inexpliquée [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 413
    Billets dans le blog
    2
    Par défaut TList : Segfault inexpliquée
    Bonjour à vous,

    J'ai un objet TCoupeDeveloppee qui contient une propriété FListeDesBranches de type TList.

    Le FListeDesBranches contient des objets de type TBrancheCoupeDeveloppee.

    Je suis confronté à ce qui semble être un bug du TList, à savoir, un segfault lors de la modification d'un item de FListeDesBranches.

    Voici les fonctions d'ajout, d'extraction et de modif:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TCoupeDeveloppee.AddBranche(const S: TBrancheCoupeDeveloppee);
    var
      pB : ^TBrancheCoupeDeveloppee;
    begin
      AfficherMessageErreur(Format('%s.AddBranche: %s', [ClassName, S.NomBranche]));
      New(pB);
      pB^ := S;
      FListeDesBranches.Add(pB);
    end;
    La fonction AddBranche fonctionne très bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function TCoupeDeveloppee.GetBranche(const Idx: integer): TBrancheCoupeDeveloppee;
    var
      pB : ^TBrancheCoupeDeveloppee;
    begin
      AfficherMessageErreur(Format('%s.GetBranche: %d', [ClassName, Idx]));
      pB := FListeDesBranches.Items[Idx];
      result := pB^;
      AfficherMessageErreur(Format('%s.GetBranche: %d - %s', [ClassName, Idx, result.NomBranche]));
    end;
    Aucun problème pour GetBranche

    Le modificateur qui pose problème:
    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
     
    procedure TCoupeDeveloppee.PutBranche(const Idx: integer; const S: TBrancheCoupeDeveloppee);
    var
      pB : ^TBrancheCoupeDeveloppee;
    begin
      AfficherMessageErreur(Format('%s.PutBranche: %d / %d - %s', [ClassName, Idx, FListeDesBranches.Count-1, S.NomBranche]));
      pB  := self.FListeDesBranches.Items[Idx];
      // affectation de la nouvelle valeur
      pB^ := S;
      // ici, on est OK 
      AfficherMessageErreur(Format('002: %d - %s - %d', [pB^.NumeroBranche, pB^.NomBranche, pB^.GetNbVisees]));
      AfficherMessageErreur(Format(' -- %d / %d', [Idx, self.FListeDesBranches.Count]));
      // L'affectation ci-dessous provoque le segfault
      // même avec un Idx valide
      self.FListeDesBranches.Items[Idx] := pB; // segfault incompréhensible
    end;
    J'ai plein d'autres listes qui contiennent des objets et je ne rencontre aucun problème

    Je ne comprends pas pourquoi je peux accéder à un item d'un TList et ne pas pouvoir le modifier.
    Ce genre de bug exaspérant est de nature à faire abandonner la programmation.

  2. #2
    Membre très actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 413
    Billets dans le blog
    2
    Par défaut TList injustement incriminé. Annulle le message précédent.
    L'instance de l'objet incriminé, créée dans une autre section du programme par une autre personne, avait été instanciée via un TObjectList.Create;

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

Discussions similaires

  1. Synchroniser 1 TListview avec 1 TList après 1 Tri
    Par delphi-fan dans le forum Langage
    Réponses: 3
    Dernier message: 05/08/2004, 12h38
  2. [TList] Double référencement
    Par Pedro dans le forum Langage
    Réponses: 5
    Dernier message: 28/07/2004, 14h14
  3. TList et redimensionnement ?
    Par cpdump dans le forum Langage
    Réponses: 3
    Dernier message: 05/05/2004, 17h54
  4. TList lente
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 17/02/2004, 02h01
  5. Transtyper element d'1 variable pointant sur TList?
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 25/02/2003, 23h53

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