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

cs_couf 220 Messages postés dimanche 5 janvier 2003Date d'inscription 6 janvier 2011 Dernière intervention - 12 févr. 2010 à 00:15 - Dernière réponse : f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention
- 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
cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - 12 févr. 2010 à 12:31
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

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de cs_yanb
Meilleure réponse
dubois77 692 Messages postés jeudi 17 avril 2008Date d'inscription 14 septembre 2018 Dernière intervention - 12 févr. 2010 à 13:41
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

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de dubois77
Meilleure réponse
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 13 févr. 2010 à 01:58
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

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de f0xi
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 12 févr. 2010 à 03:26
0
Merci
Salut,

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

- Mais que dire de plus que l'Aide ?
Commenter la réponse de Caribensila
dubois77 692 Messages postés jeudi 17 avril 2008Date d'inscription 14 septembre 2018 Dernière intervention - 12 févr. 2010 à 09:53
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
cs_couf 220 Messages postés dimanche 5 janvier 2003Date d'inscription 6 janvier 2011 Dernière intervention - 12 févr. 2010 à 11:53
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
cs_couf 220 Messages postés dimanche 5 janvier 2003Date d'inscription 6 janvier 2011 Dernière intervention - 12 févr. 2010 à 13:02
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
dubois77 692 Messages postés jeudi 17 avril 2008Date d'inscription 14 septembre 2018 Dernière intervention - 12 févr. 2010 à 13:44
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.