Boucle For qui stoppe au bout de 99 valeurs [Résolu]

Messages postés
7
Date d'inscription
lundi 3 mai 2010
Dernière intervention
11 janvier 2012
- - Dernière réponse : fbalien
Messages postés
265
Date d'inscription
dimanche 7 décembre 2003
Dernière intervention
11 novembre 2016
- 11 janv. 2012 à 15:29
Bonjour,

J'avance petit à petit dans ma programmation et je suis presque au bout.
Il me reste un petit problème (qui en fait est vraiment embêtant).
J'ai une boucle For qui s'arrête au bout de 99 tours alors que j'ai 107 lignes et qu'il les lit toutes.

Voilà mes codes :
Je copie tout d'abord mon fichier

//Début routine de .obs(Comp3D) vers .xml(GnuGama)
procedure TFMain_tcglb.comp3d2gnugamaClick(Sender: TObject);
var
   z, o                             : integer;
   ligne, lignecor                  : string;
   ligne_obs, ligne_cor             : Type_Tab_Ligne;
   N_Champs, N_Champs_cor           : integer;
   format, formatcor                : boolean;
   Tabobs                           : tab_observation;
   Tabcor                           : tab_cor;
   nomfic_obs1, nomfic_cor          : string;
   nomfic_gnu, nomfic_obs2          : string;
   control, controlcor              : Tcontrol;
   commentaire, commentairecor      : string;
   sigma_add, sigma_mult, sigma     : double;
   fcor                             : textfile;
   list_cor                         : TStringList;
   NTabcor : integer;


OpenDialog1.FileName := '';
OpenDialog1.Title := 'Choix du nom du fichier coordonnées';
OpenDialog1.Filter:='Fichier Coordonnées (*.cor)|*.cor';

if OpenDialog1.Execute then
begin

   nomfic_cor := OpenDialog1.FileName;
   format:=FALSE;

   // Chargement du fichier dans une TStringList
   assignfile(fcor,nomfic_cor);
   reset(fcor);
   list_cor := TStringList.Create;
   while (not(eof(fcor))) do begin
       readln(fcor,ligne);
       list_cor.Add(trim(ligne));
   end;
   closefile(fcor);
   //showmessage(inttostr(list_cor.Count));

   // decodage de la TStringList vers un TabObs
   setlength (Tabcor, list_cor.Count);
   NTabcor := 0;
   for o := 0 to (list_cor.Count-1) do
   begin

      Tabcor[o].CH := list_cor.Strings[o] ;
      if Tabcor[o].CH<>'' then
      begin
          lignecor :=  Copy(Tabcor[o].CH,1,1);
          if (lignecor='0') or  (lignecor='1') or (lignecor='2')
              or (lignecor='3') then
          begin
              Tabcor[o].cod := Copy(Tabcor[o].CH,1,1);
              Formatcor :=True;
              Decoupe_Ligne(Tabcor[o].CH,ligne_cor,N_Champs_cor,commentairecor);
              Tabcor[o].nompt := ligne_cor[1];
              Tabcor[o].est := ligne_cor[2];
              Tabcor[o].nord := ligne_cor[3];
              Tabcor[o].alti:=ligne_cor[4];
              Tabcor[o].sigm1:=ligne_cor[5];
              Tabcor[o].sigm2:=ligne_cor[6];
              NTabcor := NTabcor + 1;
           end
           else
        begin
            Tabcor[o].cod := '9';
         end;
      end;
   end;

   list_cor.Clear;


end;


Puis dans un second temps, je traite mes lignes pour les couper comme je le souhaite.

Var
      ficgnu                                          : TextFile;
      i,j,l,c,m,index,p,r,g                           : integer;
      observation                                     : TLigne_obs;
      cor                                             : TLigne_cor;
      last_code                                       : string[1];
      lecture                                         : real;
      k, n, Comm                                      : string;
      ouvert, houvert                                 : Boolean;
      q                                               : char;
      label etiquette1;

for i := 0 to (NTabcor-1) do begin

    cor := Tabcor[i];

        {******************** Ecriture des commentaires **********************}

    if cor.cod='9' then begin
        write(ficgnu,'<!--');
        cor.ch := trim(cor.ch);
        if (last_code <> cor.cod) then write(ficgnu,'');
        delete(cor.ch,1,1);
        if (cor.ch <> '') then
          begin
    p := Length(cor.ch);
     For r := 1 to p do
      begin
       q := cor.ch[r];

         if q = 'é' then q := 'e';
         if q = 'è' then q := 'e';
         if q = 'ê' then q := 'e';
         if q = 'ë' then q := 'e';
         if q = 'à' then q := 'a';
         if q = 'â' then q := 'a';
         if q = 'ä' then q := 'a';
         if q = 'ù' then q := 'u';
         if q = 'û' then q := 'u';
         if q = 'ü' then q := 'u';
         if q = 'î' then q := 'i';
         if q = 'ï' then q := 'i';
         if q = 'ô' then q := 'o';
         if q = 'ö' then q := 'o';
         if q = 'ÿ' then q := 'y';
         if q = '°' then q := ' ';

       cor.ch[r] := q;
      end;
   Comm := cor.ch;
  end;
        write(ficgnu,Comm);
        last_code := cor.cod;
        writeln(ficgnu,'-->');
    end;

        {******************** Coordonnées libres **********************}

    if cor.cod='0' then begin

        if (last_code <> cor.cod) then writeln(ficgnu,'');
        cor.ch := '';
        cor.ch:= cor.ch + format('   ',[cor.nompt,cor.est,cor.nord,cor.alti]);
        writeln(ficgnu,cor.ch);
        last_code := cor.cod;

    end;

    {******************** Coordonnées 3D fixées **********************}

    if cor.cod='1' then begin

        if (last_code <> cor.cod) then writeln(ficgnu,'');
        cor.ch := '';
        cor.ch:= cor.ch + format('   ',[cor.nompt,cor.est,cor.nord,cor.alti]);
        writeln(ficgnu,cor.ch);
        last_code := cor.cod;

    end;

    {******************** Coordonnées plani fixées **********************}

    if cor.cod='2' then begin

        if (last_code <> cor.cod) then writeln(ficgnu,'');
        cor.ch := '';
        cor.ch:= cor.ch + format('   ',[cor.nompt,cor.est,cor.nord,cor.alti]);
        writeln(ficgnu,cor.ch);
        last_code := cor.cod;

    end;

    {******************** Coordonnées alti fixées **********************}

    if cor.cod='3' then begin

        if (last_code <> cor.cod) then writeln(ficgnu,'');
        cor.ch := '';
        cor.ch:= cor.ch + format('   ',[cor.nompt,cor.est,cor.nord,cor.alti]);
        writeln(ficgnu,cor.ch);
        last_code := cor.cod;

    end;

end;
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
7
Date d'inscription
lundi 3 mai 2010
Dernière intervention
11 janvier 2012
3
Merci
En effet il manquait la déclaration de ma deuxième procédure où je dis que NTabcor est un integer.
Mais je ne le réinitialise pas car je veux qu'il garde la valeur prise dans la procédure 1 et elles sont liées.

En revanche, j'ai trouvé mon erreur.
Le fait de couper à 99 était une coïncidence. Je souhaitais incrémenter NTabcor à chaque boucle mais je l'avais placé trop tôt dans ma boucle. Il fallait qu'il s'incrémente aussi quand Tabcor[o].cod := '9'.
Je l'ai donc déplacé et mon problème est résolu.

Merci de votre aide. Je n'aurais sûrement jamais vu ce souci si je n'avais pas chercher de réponses à vos questions

Jordane

Dire « Merci » 3

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

Codes Sources 117 internautes nous ont dit merci ce mois-ci

Commenter la réponse de bouddha69
Messages postés
7
Date d'inscription
lundi 3 mai 2010
Dernière intervention
11 janvier 2012
0
Merci
Si quelqu'un a une idée de la raison de cet arrêt avant la fin du fichier, merci de son aide.

Jordane
Commenter la réponse de bouddha69
Messages postés
265
Date d'inscription
dimanche 7 décembre 2003
Dernière intervention
11 novembre 2016
1
0
Merci
bonjour

NTabcor est il bien initialisé ?

car il semble que vous déclariez NTabcor dans la procedure TFMain_tcglb.comp3d2gnugamaClick

Mais le seconde partie c'est une autre procédure ?
ou est la déclaration de NTabcor en début d'unité ?
Commenter la réponse de fbalien
Messages postés
265
Date d'inscription
dimanche 7 décembre 2003
Dernière intervention
11 novembre 2016
1
0
Merci
pour info si vous déclarez NTabcor dans chaque procédure ce n'est pas bon car dans ce cas la NTabcor cera une variable locale a chaque procédure
il faut donc déclarer NTabcor au niveau global
Commenter la réponse de fbalien

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.