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 :

[D2006] Pb avec 1 TStringList volatile


Sujet :

Langage Delphi

  1. #1
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 901
    Points : 6 026
    Points
    6 026
    Par défaut [D2006] Pb avec 1 TStringList volatile
    Bonjour,

    Voici mon souci:
    Dans 1 datamodule:
    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
    slDDL,slCS,slCRLF:TStringList;
    ...
    function RemoveCRLF(input:TStringList):TStringList;
    ...
    implementation
    function RemoveCRLF(input:TStringList):TStringList;
    var i:Integer;
        aTemp:string;
    const crlf=#10;
    begin
         slCRLF.Clear;
         for i := 0 to input.Count - 1 do begin
             aTemp:=input.Strings[i];
             if Pos(crlf,aTemp)<>0 then
                while Pos(crlf,aTemp)<>0 do begin
                    slCRLF.Add(LeftStr(aTemp,Pos(crlf,aTemp)-1));
                    Delete(aTemp,1,Pos(crlf,aTemp));
     
                end;
             slCRLF.Add(aTemp);
         end;
         Result:=slCRLF;
    end;  
    ...
    initialization
      ...
      slDDL:=TStringList.Create;
      slCS:=TStringList.Create;
      slCRLF:=TStringList.Create;
     
    finalization
      slDDL.Free;
      slCS.Free;
      if Assigned(slCRLF) then slCRLF.Free;
    end.
    J'ai déjà un doute sur la validité de l'argument et le resultat (tstringlist) de cette fonction.
    Bref.
    J'appelle cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    slDDL:=RemoveCRLF(slDDL);
    Lors du 1er appel, l'ensemble fonctionne selon mes désirs.
    Mais au 2nd appel, la stringlist input est ok jusqu'au moment du clear de slCRLF
    Dès lors, input est vide, mais aussi slDDL

    Quelqu'un voit-il l'origine du problème ?

    C'est d'ailleurs cette bizarrerie qui m'a conduit à libérer sous condition slCRLF
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Tu peux nous donner le code qui appèle cette fonction ?

    Essaye :

    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
    procedure RemoveCRLF(input:TStringList;Dest:TStringList);
    var i:Integer;
        aTemp:string;
    const crlf=#10;
    begin
         Dest.Clear;
         for i := 0 to input.Count - 1 do begin
             aTemp:=input.Strings[i];
             if Pos(crlf,aTemp)<>0 then
                while Pos(crlf,aTemp)<>0 do begin
                    Dest.Add(LeftStr(aTemp,Pos(crlf,aTemp)-1));
                    Delete(aTemp,1,Pos(crlf,aTemp));
     
                end;
             Dest.Add(aTemp);
         end;
    end;
    En passant slCRLF en paramètre pour Dest.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  3. #3
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 901
    Points : 6 026
    Points
    6 026
    Par défaut
    Citation Envoyé par Nono40 Voir le message
    Tu peux nous donner le code qui appèle cette fonction ?
    Cf. supra
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    slDDL:=RemoveCRLF(slDDL);
    Désires-tu plus de détails ?

    Ne faut-il pas coder
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure RemoveCRLF(input:TStringList;VAR Dest:TStringList);
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  4. #4
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 901
    Points : 6 026
    Points
    6 026
    Par défaut
    Bon, merci NoNo

    La solution a base de procedure fonctionne à tous les coups.

    Le pourquoi de ma soluce initiale avec fonction est KO reste un mystère.
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  5. #5
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    en effet, eviter de passer des objets en retour de fonction sans savoir comment le faire correctement

    sinon, pas besoin de VAR, car on travail sur un pointeur, basiquement parlant, donc on se fout qu'il soit en var ou pas.

    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 RemoveChar(Src, Dest: TStrings; Ch: char): integer;
    var I, J: Integer;
        TS, TD: String;
    begin
      result := -1;
      if not (assigned(Src) and assigned(Dest)) then
        exit;
     
      if Src.count = 0 then
        exit;
     
      Dest.BeginUpdate;
      try
        Dest.Clear;
        result := 0;
        for I := 0 to Src.Count-1 do
        begin
          TS := Src[I];
          TD := '';
          if Pos(Ch, TS) <> 0 then
          begin
            for J := 1 to Length(TS) do
              if TS[J] <> Ch then
                TD := TD + TS;
          end
          else
            TD := TS;
          Dest.Add(TD);
          inc(result);
        end;
      finally
        Dest.EndUpdate;
      end;
    end;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  6. #6
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Citation Envoyé par qi130 Voir le message
    Le pourquoi de ma soluce initiale avec fonction est KO reste un mystère.
    Je me le demande aussi. La fonction de libère pas l'objet qu'elle retourne normalement vu que l'objet doit pouvoir être utilisé en dehors de la fonction.

    Dans ce genre de cas j'utilise tout le temps une procédure afin d'être sur de qui crée/libère l'objet.

    Pour le VAR DrWho t'as répondu.
    Le VAR serait d'ailleurs plus long à l'exécution dans ce cas. Il faudra un adressage indirect de plus à chaque accès avec le VAR. C'est très trompeur le passage par valeur/référence sur les objets.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

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

Discussions similaires

  1. [Multiton] [Java] avec ou sans volatile et double check ?
    Par Cédou dans le forum Design Patterns
    Réponses: 1
    Dernier message: 01/04/2013, 21h30
  2. complication avec un TStringList
    Par scoubi32006 dans le forum C++Builder
    Réponses: 12
    Dernier message: 27/05/2008, 15h57
  3. Probleme avec une TStringList
    Par davos56 dans le forum Delphi
    Réponses: 10
    Dernier message: 12/04/2007, 11h03
  4. [D2006] EInvalidPointer avec un TObjectList.clear
    Par edrin17 dans le forum Delphi
    Réponses: 2
    Dernier message: 31/01/2007, 22h20
  5. Comment bien gerer la mémoire avec les TStringList?
    Par david_chardonnet dans le forum Langage
    Réponses: 5
    Dernier message: 18/06/2003, 09h57

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