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

Résolu
cs_couf Messages postés 213 Date d'inscription dimanche 5 janvier 2003 Statut Membre Dernière intervention 6 janvier 2011 - 12 févr. 2010 à 00:15
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 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

8 réponses

cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 13
12 févr. 2010 à 12:31
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; 
3
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
12 févr. 2010 à 13:41
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
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
13 févr. 2010 à 01:58

{
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;
3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
12 févr. 2010 à 03:26
Salut,

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

- Mais que dire de plus que l'Aide ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
12 févr. 2010 à 09:53
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
0
cs_couf Messages postés 213 Date d'inscription dimanche 5 janvier 2003 Statut Membre Dernière intervention 6 janvier 2011 1
12 févr. 2010 à 11:53
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
0
cs_couf Messages postés 213 Date d'inscription dimanche 5 janvier 2003 Statut Membre Dernière intervention 6 janvier 2011 1
12 févr. 2010 à 13:02
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
0
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
12 févr. 2010 à 13:44
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
0