Algorithmique: if imbriqué dans un repeat désolé mais je sèche. [Résolu]

Messages postés
220
Date d'inscription
dimanche 5 janvier 2003
Dernière intervention
6 janvier 2011
- - Dernière réponse : f0xi
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
- 13 févr. 2010 à 01:58
Bonjour à Tous,

J'ai un petit problème à vous soumettre j'ai déjà cherché ,
mais je sèche.
C'est vraiment une question de débutant mais je dois avouer que je ne trouve pas là solution à mon blème.

Voilà j'ai cette fonction


procedure readadr(fichier : string);
var
u,v,z :integer;
begin
u :=0;
v:=0;
TS:= tstringlist.Create;
adr:= tstringlist.create;
TS.LoadFromFile(fichier);

repeat


if copy(TS[u],1,7) ='E2EDKA2' then


begin
inc(u,1);
inc(v,1);
adr[v] := copy(TS[u],93,746) ;



end
else

inc(u,1);


until u > 45;

end;


le problème..... tout bête mais je vois pas ma faute.
il commence à chercher le string dans la 1ère ligne, la seconde... la 9 èmee mais dès qu'il trouve la chaine de caractère 1à ème ligne.
le programme se termine(je sors de la boucle repeat) sans chercher dans le reste du fichier.
j'ai déja mis un continue mais toujours pareil

Je sais que c'est tout bête mais je ne vois pas ma faute.
je regarde dans l'aide delphi mais......

Pourriez vous me guider s'il vous plaît.

couf
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
260
Date d'inscription
lundi 27 octobre 2003
Dernière intervention
4 mars 2016
3
Merci
procedure readadr(fichier : string); 
var 
  u,v,z :integer; 
begin 
  u :=0; 
  v:=0; 
  TS:= tstringlist.Create; 
  adr:= tstringlist.create; 
  TS.LoadFromFile(fichier); 
  repeat 
    if copy(TS[u],1,7) ='E2EDKA2' then 
    begin 
      inc(u); 
      inc(v); 
      adr.add(copy(TS[u],93,746));
    end 
    else 
      inc(u); 
  until u > 45;
end; 

Merci cs_yanb 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_yanb
Messages postés
692
Date d'inscription
jeudi 17 avril 2008
Dernière intervention
14 septembre 2018
3
Merci
Comment sais-tu que tu sors du repeat ? ça plante ?
parce que telle qu'elle est écrite (modifiée) le boucle doit aller jusqu'à TS.count
Sauf si adr n'a pas été initialisée avant à la bonne longueur
pour remédier à cela tu peux essayer :
//---------------------------------
procedure readadr(fichier : string);
var
u,v,z :integer; TS:= tstringlist;
begin
u :=0;
v:=0;
TS:= tstringlist.Create;
//adr:= tstringlist.create; // à faire avant
TS.LoadFromFile(fichier);
Adr.clear;
repeat
if copy(TS[u],1,7) ='E2EDKA2' then
begin
adr.add(copy(TS[u],93,746));
inc(v);
end;
inc(u);
until u>TS.count
TS.free;
end;


Dubois77

Merci dubois77 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de dubois77
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
3
Merci

{
parametres :
  aFileName : string, nom du fichier à scanner
  aAddress : TStrings, objet descendant de TStrings pour récéptionner les adresses trouvées.
  cClearOld : boolean, True efface aAddress avant ajout, False n'efface pas les aAddress avant ajout.

retour :
  integer, -3 fichier non trouvé, -2 aAddress non assigné, -1 erreur d'ouverture du fichier ou d'allocation memoire, 0 aucune entrée trouvée, sinon renvois le nombre d'adresses ajoutées à la liste.
}
function readAddress(aFileName: string; aAddress: TStrings; const cClearOld: boolean= true): integer;
var
  FL : TStringList;
  N  : Integer;
begin
  result := -3;
  if not FileExists(aFileName) then
    exit;

  result := -2;
  if not Assigned(aAddress) then
    exit;

  result := -1;
  FL := TStringList.Create;
  try
    FL.LoadFromFile(aFileName);
    if FL.Count > 0 then
    begin
      aAddress.BeginUpdate;
      try
        if cClearOld then
          aAddress.Clear;

        result := 0;
        for N := 0 to FL.Count-1 do
          if pos('E2EDKA2', FL[N]) = 1 then
          begin
            aAddress.add(copy(FL[N], 93, 746));
            inc(result);
          end;

      finally
        aAddress.EndUpdate;
      end;
      result := aAddress.Count;
    end;
  finally
    FL.Free;
  end;
end;

Merci f0xi 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de f0xi
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
Salut,

« je regarde dans l'aide delphi mais... »

- Mais que dire de plus que l'Aide ?
Commenter la réponse de Caribensila
Messages postés
692
Date d'inscription
jeudi 17 avril 2008
Dernière intervention
14 septembre 2018
0
Merci
bonjour Couf
La Tstringlist adr étant exploitée en dehors de la procédure readad, elle doit y être initialisée puis détruite au retour de la procedure readad :

adr:= tstringlist.create;

readadr(fichier);
.... exploitation de adr
adr.free

La Tstringlist TS utilisée uniquement dans la procédure peut être mise en variable locale et détruite immédiatement
Ce qui permet de pouvoir effectuer plusieurs appels de la procédure (ce qui est le but d'une procédure, sinon il suffit de mettre le code directement à l'endroit ou on en a besoin)

Telle que la procedure est faite le testr se fait sur les 45 premières lignes du "fichier"
Problème : si il y a plus de 45 lignes, les suivantes ne sont pas testées, si il y en a moins, il y a risque de plantage

Donc il faut faire le test sur la longueur totale du fichier : soit TS.count

La ligne 0 de adr n'est pas utilisée telle que la procédure est écrite : l(incrémentation doit avoir lieu après

d'ou la proc remaniée :
//---------------------------------
procedure readadr(fichier : string);
var
u,v,z :integer; TS:= tstringlist;
begin
u :=0;
v:=0;
TS:= tstringlist.Create;
//adr:= tstringlist.create; // à faire avant
TS.LoadFromFile(fichier);

repeat
if copy(TS[u],1,7) ='E2EDKA2' then
begin
adr[v] := copy(TS[u],93,746) ;
inc(v);
end;
inc(u);
until u>TS.count
TS.free;
end;


Dubois77
Commenter la réponse de dubois77
Messages postés
220
Date d'inscription
dimanche 5 janvier 2003
Dernière intervention
6 janvier 2011
0
Merci
Salut les gars

Merci pour les réponses
Dubois77 j'avais déjà essayé ce que tu me disais
mais toujours pareil.( j'ai mis à 45 volontairement.
le TS, est appelé globalement dans le prog )
je t'explique:
je rentre bien dans la boucle,
mais à la première occurrence rencontré (traitement du if)
je sors de la boucle repeat.
au pire des cas, je vais faire avec avec un label et un GOTO

Que dire de plus de l'aide biiiiiiiiiinnnnnnnnnn là rien puisque je comprends pas pourquoi ça marche pas

en clair si je peux résumé

mon problème

repeat
if condition true then
iNSTRUCTION1;
instruction2;

until valeur atteinte.


mon problème c'est pourquoi si if condition true then
il sort de la boucle et ne continue pas until valeur atteinte

je ne comprends pas mon ereur, je vais continuer à cher.


couf
Commenter la réponse de cs_couf
Messages postés
220
Date d'inscription
dimanche 5 janvier 2003
Dernière intervention
6 janvier 2011
0
Merci
MAis ouiiiiiiiiiii bien suuuuuuuuuuuuuur adr.add(copy(TS[u],93,746)); merci yanb

mon dieu ce que je suis bête pardon tout le monde pour le dérangement
c'est les vacances ce soir promis je laisse mon PC .
et vais me reposer.

Je suis vraiment fatigué.
Désolé encore tout le monde. et merci à toys ceux qui m'ont répondu


couf
Commenter la réponse de cs_couf
Messages postés
692
Date d'inscription
jeudi 17 avril 2008
Dernière intervention
14 septembre 2018
0
Merci
excuse moi yanb, je n'avais pas réiinitialisé mon ecran et n'avais pas vu que tu avais déjà résolu l'affaire
désolé d'avoir poste hors délai !


Dubois77
Commenter la réponse de dubois77

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.