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 :

For To Do Problème à la deuxième boucle


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    Points : 12
    Points
    12
    Par défaut For To Do Problème à la deuxième boucle
    Bonjours a tous.

    cela fait maintenant 2 jours que je me casse la tête à essayer de trouver pourquoi ma procédure ne marche pas...

    c'est une procédure qui analyse un texte (d'un jeu en ligne) et qui en extrait les valeurs voulus.

    voici la procédure qui m'embête:
    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
    procedure NbTroupeArmee(NomTroupes, Source:String);
    var
    Ligne, Ligne2, Ligne3:String; // décomposition des étapes pour trouver où ca plante.
    i,j:Integer;
    begin
    j:=NbSousChaine(NomTroupes,Source); //NbSousChaine fonction qui renvoi le nombre de fois que la chaine est répété dans la source.
    //début de la boucle
    for i:= 1 to j do
     begin
     Armee:=gauche(' 		',Ndroite(NomTroupes,Source,i)); 
    //Ndroite fonction qui renvois ce qu'il y a à droite de la 'i' ème chaine 'NomTroupes' 
    // gauche fonction qui renvoi ce qu'il y a à gauche de ' 		'.
     Ligne:=Ndroite(NomTroupes+Armee+' '+char(#9)+char(#9),Source,i);
     Ligne2:=gauche(' '+char(#9),ligne); 
     Ligne3:=StrReplace(' ','',StrReplace(char(#9),'',StrReplace('.','',Ligne2))); // Suppression des . des milliers et des espaces
     NbTroupes:=StrToInt(Ligne3);
    //affectation des valeurs aux variables déclarées dans mon Unit.
     if Armee= 'Armée 1' then VarArmee1:=IntToStr(NbTroupes);
     if Armee= 'Armée 2' then VarArmee2:=IntToStr(NbTroupes);
     if Armee= 'Armée 3' then VarArmee3:=IntToStr(NbTroupes);
     if Armee= 'Réserve' then VarArmeeR:=IntToStr(NbTroupes);
     end;
    end;
    voila le texte que je cherche a annaliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    {Réorganisation
    Unité 	Origine 	Destination 	Stock 	Quantité
    Leopard 3 	Réserve 		3.000.000 	
    Sous-marin d attaque 	Réserve 		1.500.000 	
    Sous-marin lanceur d engins 	Réserve 		1.010.000 	
    Eurofighter Typhoon 	Réserve 		64.000.000 	
    F22 Raptor 	Réserve 		46.100.000 	
    Frégate de 2nd rang 	Réserve 		1.600.000 	
    Northrop B2 Spirit 	Réserve 		600.000 	
    Eurofighter Typhoon 	Armée 1 		35.000.000 	
    F22 Raptor 	Armée 1 		15.000.000 	}

    Dans ma procédure, je donne le Nom des troupes ('F22 Raptor ' par exemple) avec le texte au dessus comme source
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure NbTroupeArmee(NomTroupes, Source:String);
    dan un 1er temps je détermine le nombre de fois qu'est répété la troupe cherchée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    j:=NbSousChaine(NomTroupes,Source);
    ensuite je commence ma boucle For To Do
    je récupère l'Armée de la 1er Troupe (ici Réserve)
    je récupère le nombre de troupe en le nettoyant (ici 46100000)
    Enfin j'affecte les valeurs trouvées a des variables voulu en fonction des armée.

    Mon problème:
    i:=1 nikel.
    i:=2 la variable "Ligne" renvoi '' (vide) ce qui fait planter l'affectation de ma variable "Ligne2" (je l'ai décomposé en 3 lignes pour savoir où ça plantait).

    Je ne vois pas pourquoi tout ce passe bien avec la boucle quand i:=1 et que ce merde quand i:=2. Je demande donc de l'aide pour m'ouvrir les yeux s'il vous plais et de me donner des pistes pour enlever ce tronc d'arbre dans mon pied, sinon je vais finir chauve.

    PS: je suis débutant alors pardonnez mon code

    Merci d'avance.
    Jeanver

  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 445
    Points
    28 445
    Par défaut
    Bonjour,

    je n'ai pas regardé le détail de ton code qui me semble confus, mais je te propose une autre approche avec la fonction PosEx() ou Pos() selon ta version de Delphi

    voici un code a adapté si besoin, j'ai considéré que les champs étaient séparés par #9 et la fin de ligne en #13

    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
     
     
    procedure NbTroupesArme(NomTroupes, Source: string);
    var
      i : Integer;
      Armee : string;
      Troupes: string;
    begin
      i := Pos(NomTroupes + #9, Source);
      while i > 0 do
      begin
        Source[i] := '*' // cf PosEx() pour éviter cela
     
       // le nom est suivi d'un #9
        Inc(i, Length(NomTroupes) + 1);
     
       // on trouve alors l'armée
        Armee := Copy(Source, i, MaxInt);
     
      // le #9 sépare Armée et Troupes
        i := Pos(#9, Armee);
        Troupes := Copy(Armee, i + 1, MaxInt);
        SetLength(Armee, i - 1);
     
      // la fin de ligne après Troupes
        i := Pos(#13, Troupes);
        SetLength(Troupes, i - 1);
     
        // ici Armee = 'Réserve' et Troupes = '46.100.000'
     
       // recherche à nouveau le nom
        i := Pos(NomTroupes + #9, Source);
      end;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Déjà Merci a toi d'avoir pris le temps de me lire et de me répondre.

    je regarde ça ce soir des que je rentre et je te tiens au courant.

    cordialement
    jeanver

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    bon j'ai un peut tarder a répondre car j'y ai regarder en plusieurs soir car je suis un débutant et de ce fait j'ai pas forcément tout compris au code (et que en plus le simple copier coller ne suffit pas).

    j'imagine que quand tu marque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    // ici Armee = 'Réserve' et Troupes = '46.100.000'
    c'est a cette endroit la que je doit assigner les valeurs a mes variables genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if Armee := 'Réserve' then MaVariable1:=Troupes;
    [...]
    évidement ça ne marche pas... je pense donc qu'il faut adapter un peut plus le code mais comme je ne connais pas trop le code que tu as utilisé, je n'arrive pas a le manipuler...

  5. #5
    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 445
    Points
    28 445
    Par défaut
    mon code n'utilise que trois fonctions !

    Pos() qui cherche la position d'une chaine dans une autre
    Copy() qui extrait une portion de chaîne
    SetLengt() pour tronquer une chaîne à une taille donnée

    si ton texte est sous la forme

    NomTroupe<tabulation>Armée<tabulation>Nombre<FinDeLigne>
    NomTroupe<tabulation>Armée<tabulation>Nombre<FinDeLigne>
    NomTroupe<tabulation>Armée<tabulation>Nombre<FinDeLigne>

    il me parait logique de recherche "NomTroupe" + #9

    avec PosEx() tu peux relancer une recherche à partir d'un index de départ.
    Pos() recherche toujours depuis le début, c'est pourquoi je remplace le premier caractère du nom par un "*" afin qu'il ne soit ignoré dans la boucle suivante.

    premier passage:

    *omTroupe<tabulation>Armée<tabulation>Nombre<FinDeLigne>
    NomTroupe<tabulation>Armée<tabulation>Nombre<FinDeLigne>
    NomTroupe<tabulation>Armée<tabulation>Nombre<FinDeLigne>


    deuxième passage

    *omTroupe<tabulation>Armée<tabulation>Nombre<FinDeLigne>
    *omTroupe<tabulation>Armée<tabulation>Nombre<FinDeLigne>
    NomTroupe<tabulation>Armée<tabulation>Nombre<FinDeLigne>

    troisième passage


    *omTroupe<tabulation>Armée<tabulation>Nombre<FinDeLigne>
    *omTroupe<tabulation>Armée<tabulation>Nombre<FinDeLigne>
    *omTroupe<tabulation>Armée<tabulation>Nombre<FinDeLigne>

    "NomTroupe" + #9 n'est plus trouvé, fin de la boucle

    Dans copy() j'utilise MaxInt ( = beaucoup ) pour copier tout le reste du texte sans me préoccuper de sa taille réelle.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    merci a toi de prendre le temps de m'expliquer tout ça, je vais potasser tout cela et je te dit le résultat (mais pas de suite).

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    MERCI a toi, après une rapide adaptation, tout fonctionne, je n'ai juste eu qu'a faire une légère modification dans mon code et a rajouter un filtre pour le nombre de troupe (enlever les ' ', #9 et les '.') et l’affecté dans 4 variables différentes en fonction de son armée et le tour est joué.
    Encore merci a toi. je clic sur le bouton 'résolu'

    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
    procedure NbTroupeArmee(NomTroupe, Source: string);
    var
      i : Integer;
      Armee : string;
      Troupes: string;
    begin
      i := Pos(NomTroupe +#9, Source);
      while i > 0 do
      begin
        Source[i] := '*'; // cf PosEx() pour éviter cela
     
        Inc(i, Length(NomTroupe) + 1); // le nom est suivi d'un #9
     
        Armee := Copy(Source, i, MaxInt);// on trouve alors l'armée
     
        i := Pos(#9, Armee);  // le #9 sépare Armée et Troupes
        Troupes := Copy(Armee, i + 1, MaxInt);
        SetLength(Armee, i - 1);
     
        i := Pos(#13, Troupes);  // la fin de ligne après Troupes
        SetLength(Troupes, i - 1);
     
        Troupes:=StrReplace(' ','',Troupes); //suppression des espaces
        Troupes:=StrReplace(#9,'',Troupes); //suppression des tabulations
        Troupes:=StrReplace('.','',Troupes); //suppression des points
        if Armee= 'Armée 1 ' then VarArmee1:=StrToInt(Troupes);
        if Armee= 'Armée 2 ' then VarArmee2:=StrToInt(Troupes);
        if Armee= 'Armée 3 ' then VarArmee3:=StrToInt(Troupes);
        if Armee= 'Réserve ' then VarArmeeR:=StrToInt(Troupes);
     
        i := Pos(NomTroupe +#9, Source); // recherche à nouveau le nom
      end;
    end;

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

Discussions similaires

  1. [Débutant] Gros problème avec ma deuxième boucle for
    Par djobadi dans le forum MATLAB
    Réponses: 4
    Dernier message: 15/01/2014, 23h54
  2. problème avec une boucle For
    Par mademoizel dans le forum ASP
    Réponses: 3
    Dernier message: 24/03/2007, 13h20
  3. [MySQL] problème sur une boucle for
    Par leclone dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 28/12/2006, 10h33
  4. Réponses: 2
    Dernier message: 29/08/2006, 13h59
  5. Problème avec une boucle for
    Par cisse18 dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 29/03/2006, 16h50

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