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 :

Problème Arnaud <> récursivité


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 22
    Points : 17
    Points
    17
    Par défaut Problème Arnaud <> récursivité
    Bonjour,
    je viens de parcourir le forum et la FAQ ainsi que google mais sans succès pour resoudre mon probleme.

    Je tente de faire un procedure qui va lister tous les fichiers appelés dans des scripts de tests.
    je m'explique :
    1-les scripts sont des fichiers texte contenant des lignes de commande
    2-ils contiennent aussi des appels à d'autres scripts
    3-je souhaite lister tous les fichiers impliqués dans l'appel d'un script.

    ce que j'ai fait :
    1-j'ouvre le fichier texte et parcourir les lignes une à une
    a-si je trouve un appel (.CALL) à un autre script :
    i-j'ouvre le fichier texte et parcourir les lignes une à une...

    et ainsi de suite...

    j'ai essayé de faire cela en ecrivant une procedure qui s'appelle elle meme pour effectuer le traitement de maniere la plus élégante possible. Mais il s'avère que la récursivité cela ne fonctionne pas...(ou du moins je l'utilise mal) une fois appelée la procédure ne revient pas pour effectuer le reste du traitement...
    je ne sais pas si je suis très clair mais je suis malade comme un chien... alors excusez moi...

    Kanter,
    malade...

    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
    procedure TForm1.SearchFile(Fichier : String);
    var
      Index : Integer;
      WorkFile : TStrings;
      Buffer,
      Dest : String;
     
    begin
      WorkFile := TStringList.Create;
      WorkFile.LoadFromFile(Fichier);
     
      for Index := 0 to WorkFile.Count - 1 do
      begin
        if Pos('.CALL',WorkFile.Strings[Index]) <> 0 then
        begin
            Dest := Traitement(WorkFile.Strings[Index]);   //Retire .CALL
            RichEdit.Lines.Add(Dest);
            SearchFile(Dest);
         end;
      end;
    end;

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 108
    Points : 77
    Points
    77
    Par défaut
    bonjour je propose un truc mais je suis pas sûr du tout

    il faudrais qu'une fois a la fin de ton fichier ouver tu retourne dans la premier a la ligne ou tu t'ai arrété
    tu recupérre la ligne dans une variable
    et aprés si ton nouveau fichier est arriver a la fin (avec un truc du genre if EOF ... then) tu réouvre ton premier fichier en te placent a la ligne +1 que tu a récupérer dans ta variable avant.

    dit moi si c'est une idée potable ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Je croyais que la récursivité s'en chargeait toute seule ?!

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    il te manque plein de chose dans ton code, c'est normal que cela ne fonctione 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
     
    procedure TForm1.SearchFile(Fichier : String);
    var
      Index : Integer;
      WorkFile : TStrings;
      Buffer,
      Dest : String;
       iPos : integer;
    begin
      WorkFile := TStringList.Create;
      try
        WorkFile.LoadFromFile(Fichier);
     
        for Index := 0 to WorkFile.Count - 1 do
        begin
          iPos := Pos('.CALL',WorkFile.Strings[Index]);
          if  iPos > 0 then
          begin
             // faut peut être récupérer le nom du fichier si tu veux passer à la suite
              Dest := Copy(WorkFile.Strings[Index],iPos + 5,Length(WorkFile.Strings[Index]) - iPos - 5);
              RichEdit.Lines.Add(Dest);
              SearchFile(Dest);
           end;
        end;
      finally
        // Il faut toujours penser à libérer les objets créer dynamiquement surtout 
        // dans une fonction récursive
        WorkFile.free;
      end;
    end;
    Sinon, il faudrait que tu fasses un pas à pas pour voir comment réagit ta procedure.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Désolé mais c'etait un copier coller ou il manquait des choses...
    je m'en excuse, c'est corrigé...
    C'est sur que je ne viendrais pas pleurer sur le forum si je n'avais pas relu mon code avant... j'avais juste retirer le traitement de la chaine de caracteres...

    c'est que je me ferai rouspéter ?!

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Kanter
    c'est que je me ferai rouspéter ?!
    Non, non

    Sinon, Est ce que tu es sûr :
    - Que le fichier test que tu utilises , a cette fonction [.CALL + Chemin+NomFichier] ?
    - Que ton découpage est bon ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    J'ai bien l'impression que le try...Finally et destruction de ma TList ai résolu mon problème.

    Mais vous connaissant, je pense que vous aller me dire :
    "attention Petit ?! et si jamais un script A appelait un script B qui a son tour appelle le script A... tu pars en boucle infini avec tout ce que cela engendre"

    et bien je vous répondrais : "J'y pense et j'y travaille"...

    Merci,
    Je teste tout ca et je tag mon post en [RESOLU]... promis !

    Kanter,
    qui a vomis sur lui ce matin... (véridique)

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Kanter
    Mais vous connaissant, je pense que vous aller me dire :
    "attention Petit ?! et si jamais un script A appelait un script B qui a son tour appelle le script A... tu pars en boucle infini avec tout ce que cela engendre"

    et bien je vous répondrais : "J'y pense et j'y travaille"...
    J'y pensais si fort que ça ????
    Il te suffit juste de vérifier, que tu n'appels pas 2 fois le meme fichier


    Citation Envoyé par Kanter
    Kanter,
    qui a vomis sur lui ce matin... (véridique)
    Et tu as fait un : brrroooo ? (Kanter Brooo )

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Merci Papa...

  10. #10
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    hoppopopopop !!!!

    et si tu n'as aucune ligne dans ton fichier de script ????

    Illustration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i:=0 to Lignes.count-1 do //count=0 
      s:=Lignes[i]; //plantage la ligne n°0 n'existe même pas !
    Remèdes :
    - Un bon grog
    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       i:=0;
      while i<Lignes.count do
      begin 
          s:=Lignes[i]; 
          inc(i);
      end;

    Donc, en reprenant le code de Malatar (avec le Free indispensable) :
    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
    procedure TForm1.SearchFile(Fichier : String);
    var
      Index : Integer;
      WorkFile : TStrings;
      Buffer,
      Dest : String;
       iPos : integer;
    begin
      WorkFile := TStringList.Create;
      try
        WorkFile.LoadFromFile(Fichier);
        Index:=0;
        while Index<WorkFile.Count do
        begin
          iPos := Pos('.CALL',WorkFile.Strings[Index]);
          if  iPos > 0 then
          begin
             // faut peut être récupérer le nom du fichier si tu veux passer à la suite
              Dest := Copy(WorkFile.Strings[Index],iPos + 5,Length(WorkFile.Strings[Index]) - iPos - 5);
              RichEdit.Lines.Add(Dest);
              SearchFile(Dest);
           end;
           inc(Index);
        end;
      finally
        // Il faut toujours penser à libérer les objets créer dynamiquement surtout 
        // dans une fonction récursive
        WorkFile.free;
      end;
    end;
    Et pour gérer les appels en boucle infinie :
    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
    73
    74
    75
    76
    77
    78
    79
     
    //private de la fiche
    private
       PileFichiersTraites:TStringList;
       BoucleInfinie:TStringList;
     
    //OnCreate de la fiche :
    procedure TForm1.Form1Create(Sender:TObject);
    begin
       PileFichiersTraites:=TStringList.Create;
       BoucleInfinie:=TStringList.Create;
    end;
     
    //OnDestroy de la fiche :
    procedure TForm1.Form1Destroy(Sender:TObject);
    begin
       PileFichiersTraites.Free;
       BoucleInfinie.Free;
       IndexDebutBoucle:integer;
    end;
     
     
    //c'est la nouvelle procédure à appeler ;)
    procedure TForm1.Cherche(Fichier : String);
    begin
      IndexDebutBoucle:=-1;
      PileFichiersTraites.Clear; 
      BoucleInfinie.Clear;
      if not SearchFile(Fichier) 
      then begin
               ShowMessage('Appel de Script en boucle !');
               //Afficher Le Contenu de BoucleInfinie
               ...J'ai la flemme
             end;
    end;
     
    function TForm1.SearchFile(Fichier : String):boolean; //maintenant, c'est une fonction
    var
      Index : Integer;
      WorkFile : TStrings;
      Buffer,
      Dest : String;
       iPos : integer;
    begin
      result:=false;
      if PileFichiersTraites.indexOf(fichier)>-1 
      then begin
               IndexDebutBoucle:=PileFichiersTraites.indexOf(fichier);
               exit; //On sort de la fonction on a un duplicata
             end;
     
      result:=true;
      PileFichiersTraites.Add(Fichier); //On empile
      WorkFile := TStringList.Create;
      try
        WorkFile.LoadFromFile(Fichier);
        Index:=0;
        while ((Index<WorkFile.Count) and result) do
        begin
          iPos := Pos('.CALL',WorkFile.Strings[Index]);
          if  iPos > 0 then
          begin
             // faut peut être récupérer le nom du fichier si tu veux passer à la suite
              Dest := Copy(WorkFile.Strings[Index],iPos + 5,Length(WorkFile.Strings[Index]) - iPos - 5);
              RichEdit.Lines.Add(Dest);
              result:=SearchFile(Dest);
              if not result //On a eu une boucle infinie
              then if IndexDebutBoucle<=PileFichiersTraites.Count 
                    then BoucleInfinie.Insert(0,Dest);
           end;
           inc(Index);
        end;
        PileFichiersTraites.Delete(PileFichiersTraites.Count-1); //On désempile
      finally
        // Il faut toujours penser à libérer les objets créer dynamiquement surtout 
        // dans une fonction récursive
        WorkFile.free;
      end;
    end;
    voilà et soigne toi bien

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Merci, je vais tester cela dès que possible...
    mais j'ai un max de taf aujourd'hui et j'ai mal aux dents maintenant...
    Bordel... Marre des chicots...

    @+...
    je taggue [RESOLU] si cela fonctionne...

  12. #12
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Kanter
    Merci, je vais tester cela dès que possible...
    mais j'ai un max de taf aujourd'hui et j'ai mal aux dents maintenant...
    Bordel... Marre des chicots...

    @+...
    je taggue [RESOLU] si cela fonctionne...
    No problemo, et prend rendez vous chez le dentiste

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 22
    Points : 17
    Points
    17
    Par défaut

  14. #14
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Kanter
    Eussé-je compris à travers cette réponse sybilline que tu aimes le dentiste ?

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

Discussions similaires

  1. [XL-2003] VBA: Problème avec menus contextuels (récursivité ?)
    Par orpheu dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 21/02/2012, 22h55
  2. Problème de récursivité
    Par mehdi.berra dans le forum C
    Réponses: 8
    Dernier message: 14/12/2006, 17h42
  3. Réponses: 4
    Dernier message: 08/12/2006, 11h15
  4. glob & récursivité : étrange problème
    Par Mat_F dans le forum Langage
    Réponses: 3
    Dernier message: 27/07/2006, 12h23
  5. Problème de récursivité
    Par tazmania dans le forum C
    Réponses: 24
    Dernier message: 14/12/2005, 14h34

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