Incompréhensible

Résolu
darnau Messages postés 11 Date d'inscription mardi 7 novembre 2006 Statut Membre Dernière intervention 29 avril 2008 - 29 avril 2008 à 11:39
darnau Messages postés 11 Date d'inscription mardi 7 novembre 2006 Statut Membre Dernière intervention 29 avril 2008 - 29 avril 2008 à 14:41
Bonjour,

Je me permet de solliciter à nouveau votre aide.

Voila je ne comprend pas un problème... Pourquoi une instruction
que je répète 361 fois fonctionne si je saisis 361 fois les
instructions correspondantes et ne fonctionne pas dans une boucle for
i:=0 to 361 do :

J'ai uploadé mon projet sur free.fr à l'adresse suivante : http://dl.free.fr/otwSd2Zds/LOGGPS.zip

Le code n'étant pas commenté (Pardon d'avance...) je consulterais
régulièrement le forum pour répondre à vos éventuelles questions.

En vous remerciant!

Cordialement,

Arnaud

13 réponses

dominique.stock Messages postés 436 Date d'inscription vendredi 7 novembre 2003 Statut Membre Dernière intervention 8 octobre 2008 7
29 avril 2008 à 14:27
A mon avis il serait interressant que tu regardes exactement à quel ligne il plante .... et avec quelle donnée

Dom
3
dominique.stock Messages postés 436 Date d'inscription vendredi 7 novembre 2003 Statut Membre Dernière intervention 8 octobre 2008 7
29 avril 2008 à 11:44
Bonjour,
Attention de 0 à 361 cela fait 362 fois ...

Dom
0
darnau Messages postés 11 Date d'inscription mardi 7 novembre 2006 Statut Membre Dernière intervention 29 avril 2008
29 avril 2008 à 11:49
Ah oui en effet dsl c'est une faute de frappe...Mais je n'ai pas fait l'erreur dans mon projet!

De quoi cela peut il bien venir ??

D@rNaU
0
dominique.stock Messages postés 436 Date d'inscription vendredi 7 novembre 2003 Statut Membre Dernière intervention 8 octobre 2008 7
29 avril 2008 à 11:55
impossible d'ouvrir ton zip
Poste ton code + message erreur

Dom
0

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

Posez votre question
Sat83 Messages postés 166 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 13 octobre 2008
29 avril 2008 à 11:57
Bonjour,

Qu'est ce qui pose problème exactement?

Poste le bout de code posant problème ici, je pense que ce sera mieux.
0
darnau Messages postés 11 Date d'inscription mardi 7 novembre 2006 Statut Membre Dernière intervention 29 avril 2008
29 avril 2008 à 12:10
unit LOGGPS;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Dessin, uDm;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    Edit1: TEdit;
    Ed_type: TEdit;
    Label1: TLabel;
    Ed_Xmin: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Ed_Ymin: TEdit;
    Label4: TLabel;
    Ed_Xmax: TEdit;
    Label5: TLabel;
    Label6: TLabel;
    Ed_Ymax: TEdit;
    Ed_Version: TEdit;
    Label7: TLabel;
    Button2: TButton;
    Memo1: TMemo;
    Ed_FileLength: TEdit;
    procedure Button1Click(Sender: TObject);
    function HexToDouble(i64 : int64): string;
    function HexToInt (Value:string) : Integer;
    procedure Button2Click(Sender: TObject);
    function DoubleToInt(Value: string) : String;
    procedure TraitementHeader();
    procedure TraitementFichier();
    function Lire(Position : integer; Boucle : integer; mode:string) : string;
    procedure FormCreate(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  f : TFileStream;
  l, c, PosActual: Integer;
  num, o , Inutile: String;
  Premier : Boolean ;
  Form1: TForm1;
  FileName : string;
  ShapeType: string;

implementation

{$R *.dfm}

procedure Tform1.TraitementFichier();
var
        Index, X : integer;
        chaine : string;
begin
   Inutile:=IntToStr(HexToInt(Lire(PosActual,4,'Big')));
   Memo1.Lines.Add(Inutile);
   Index:= Memo1.Lines.IndexOf(Inutile);
   Memo1.lines.add(Lire(PosActual,4,'Big'));
   ShapeType:=Lire(PosActual, 4, 'Little');
   if ShapeType = '00000001' then begin
       
chaine:=HexToDouble(StrToInt64('$'+Lire(PosActual, 8, 'Little')))+''' ,
'''+HexToDouble(StrToInt64('$'+Lire(PosActual, 8, 'Little')));
        dm.QMBR2.close;
        dm.QMBR2.SELECTSql.Clear;
        dm.QMBR2.SELECTsql.add('INSERT INTO POINT (X, Y) VALUES ('''+chaine+''')');
        dm.QMBR2.open;
        dm.TRMBR.CommitRetaining;
        //Memo1.Lines[Index]:=Memo1.Lines[Index]+ '  -   Point : ' ;
       
//Memo1.lines.add(HexToDouble(StrToInt64('$'+Lire(PosActual, 8,
'Little')))+ '    -     '+HexToDouble(StrToInt64('$'+Lire(PosActual, 8,
'Little'))));
    end
    else if ShapeType = '00000005' then begin

        Memo1.Lines[Index]:=Memo1.Lines[Index]+ '  -   MBR : ' ;
       
Memo1.lines.add(HexToDouble(StrToInt64('$'+Lire(PosActual, 8,
'Little')))+ '    -     '+HexToDouble(StrToInt64('$'+Lire(PosActual, 8,
'Little')))+ '    -     '+HexToDouble(StrToInt64('$'+Lire(PosActual, 8,
'Little')))+ '    -     '+HexToDouble(StrToInt64('$'+Lire(PosActual, 8,
'Little'))));
        Memo1.lines.add(IntToStr(HexToInt(Lire(PosActual, 4, 'Little'))));
        Memo1.lines.add(IntToStr(HexToInt(Lire(PosActual, 4, 'Little'))));
        Memo1.lines.add(IntToStr(HexToInt(Lire(PosActual, 4, 'Little'))));

       
chaine:=HexToDouble(StrToInt64('$'+Lire(PosActual, 8, 'Little')))+''' ,
'''+HexToDouble(StrToInt64('$'+Lire(PosActual, 8, 'Little')));
        dm.QMBR2.close;
        dm.QMBR2.SELECTSql.Clear;
        dm.QMBR2.SELECTsql.add('INSERT INTO POINT (X, Y) VALUES ('''+chaine+''')');
        dm.QMBR2.open;
        dm.TRMBR.CommitRetaining;
        chaine:='';

       
chaine:=HexToDouble(StrToInt64('$'+Lire(PosActual, 8, 'Little')))+''' ,
'''+HexToDouble(StrToInt64('$'+Lire(PosActual, 8, 'Little')));
        dm.QMBR2.close;
        dm.QMBR2.SELECTSql.Clear;
        dm.QMBR2.SELECTsql.add('INSERT INTO POINT (X, Y) VALUES ('''+chaine+''')');
        dm.QMBR2.open;
        dm.TRMBR.CommitRetaining;
             x:=x+1;

// Avec donc 361 fois l'instruction précédente le code fonctionne et rendre les données dans la base...

        {
    x:=0;
        while x < 360 do
        begin
               
chaine:=HexToDouble(StrToInt64('$'+Lire(PosActual, 8, 'Little')))+''' ,
'''+HexToDouble(StrToInt64('$'+Lire(PosActual, 8, 'Little')));
                dm.QMBR2.close;
                dm.QMBR2.SELECTSql.Clear;
                dm.QMBR2.SELECTsql.add('INSERT INTO POINT (X, Y) VALUES ('''+chaine+''')');
                dm.QMBR2.open;
                dm.TRMBR.CommitRetaining;
                x:=x+1;
        end;
        }

    end;

end;

procedure Tform1.TraitementHeader();
Var
        FileLength : Extended;
        chaine : string;
        test: integer;
begin

    Edit1.Text:=Lire(PosActual,2,'Big');
    Inutile:=Lire(PosActual,20, 'Big');
    Ed_FileLength.Text:=Lire(PosActual,4,'Big');
    FileLength:=HexToInt(Ed_FileLength.Text);
    Ed_FileLength.Text:=FloatToStr(FileLength/2);
    Ed_Version.Text:=Lire(PosActual,4, 'Little');
    Ed_type.Text:=Lire(PosActual,4, 'Little');
    if StrToInt(Ed_type.Text) = 1 then begin
        Label1.Caption:='C''est un point';
        ShapeType:='00000001';
    end
    else if StrToInt(Ed_type.Text) = 5 then begin
        Label1.Caption:= 'C''est des polygones';
        ShapeType:='00000005';
    end;
    Ed_Xmin.Text:=Lire(PosActual, 8, 'Little');
    Ed_Ymin.Text:=Lire(PosActual,8, 'Little');
    Ed_Xmax.Text:=Lire(PosActual,8, 'Little');
    Ed_Ymax.text:=Lire(PosActual,8, 'Little');
    Edit1.Text:=IntToStr(HexToInt(Edit1.Text));
    Ed_Xmin.Text:=(HexToDouble(StrToInt64('$'+Ed_Xmin.Text)));
    Ed_Ymin.Text:=(HexToDouble(StrToInt64('$'+Ed_Ymin.Text)));
    Ed_Xmax.Text:=(HexToDouble(StrToInt64('$'+Ed_Xmax.Text)));
    Ed_Ymax.Text:=(HexToDouble(StrToInt64('$'+Ed_Ymax.Text)));
    Ed_Version.Text:=IntToStr(HexToInt(Ed_Version.Text));
        CHAINE:=Ed_Xmin.Text+''','''+Ed_Xmax.Text+''','''+Ed_Ymin.Text+''','''+Ed_Ymax.Text;
        dm.QMBR2.close;
        dm.QMBR2.SELECTSql.Clear;
        test:=dm.QMBR2.SELECTsql.add('INSERT INTO MBR (XMIN, XMAX, YMIN, YMAX) VALUES ('''+chaine+''')');
        Memo1.Lines.Add(dm.QMBR2.SelectSQL[test]);
        //dm.QMBR2.SELECTsql.Add('  VALUES('+chaine+')');
        dm.QMBR2.open;
        dm.TRMBR.CommitRetaining;

    end;

function Tform1.Lire(Position : integer; Boucle : integer; mode:string) : string;
var
    c : Integer;

  begin
    PosActual:=PosActual+Boucle;
    f.Position := Position;
    SetLength(o, 16);
    f.Read(o[1], 16);
    if mode = 'Big' then begin
        for c:=1 to Boucle do begin
           Result:=Result+IntToHex(ord(o[c]),2);
        end;
    end
    else begin
        c:=Boucle;
        while c <> 0 do begin
                Result:=Result+IntToHex(ord(o[c]),2);
                c:=c-1;
        end;
    end;
   end;
procedure TForm1.Button1Click(Sender: TObject);
begin

    PosActual:=2;
    Edit1.Text:='';
    Ed_type.Text:='';
    Ed_Xmin.text:='';
    Ed_Ymin.Text:='';
    Ed_Xmax.Text:='';
    Ed_Ymax.Text:='';
    Ed_Version.Text:='';
    premier:=true;
    if OpenDialog1.Execute then begin
    FileName:=OpenDialog1.FileName;
    f := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
    TraitementHeader();
    PosActual:=PosActual+32;
    while PosActual <  HexToInt(Ed_FileLength.Text) do
        TraitementFichier();
    end;
end;

function TForm1.HexToDouble(i64 : int64): string;
var
  r: Double absolute i64; // r a donc la même adresse que i64, et tous les 2 sont codés sur 8 octets
begin
        // on affecte l'un des deux
  //ShowMessage(FloatToStr(r)); // et on lit l'autre...
  result:=FloatToStr(r)  ;
end;

Function TForm1.HexToInt (Value:string) : Integer;
begin
result := StrToInt('$'+ Value);
end;

function TForm1.DoubleToInt(Value : string) : string;
var i : integer;
ResultTemp :string;

begin
ResultTemp := '';
for i:=1 to 32 do begin

        if Value[i] = ',' then
                break
        Else
                ResultTemp:=ResultTemp+Value[i];
end;
        Result:=ResultTemp;
end;

end.

Le message d'erreur quand je remplace les instruction par une boucle for ou while:
Le
projet ProjLOGGPS.exe a provoqué une classe d'exception EConvertError
avec le message "$4013F8468F781F3D4013F85B882DA821' n'esr pas une
valeur entière correcte'. Processus stoppé. Utilisez Pas-à-pas ou
Exécuter pour continuer.
0
dominique.stock Messages postés 436 Date d'inscription vendredi 7 novembre 2003 Statut Membre Dernière intervention 8 octobre 2008 7
29 avril 2008 à 12:31
à quelle itération plante-t'il ?
Quelle ligne ?

Dom
0
darnau Messages postés 11 Date d'inscription mardi 7 novembre 2006 Statut Membre Dernière intervention 29 avril 2008
29 avril 2008 à 12:39
Alors je vien de regarder, c'est donc durant le deuxième passage dans la boucle après l'initialisation de la valeur de Chaine. Tout de suite après..

D@rNaU
0
dominique.stock Messages postés 436 Date d'inscription vendredi 7 novembre 2003 Statut Membre Dernière intervention 8 octobre 2008 7
29 avril 2008 à 13:19
 chaine:=HexToDouble(StrToInt64('$'+Lire(PosActual, 8, 'Little')))+''' , '''+HexToDouble(StrToInt64('$'+Lire(PosActual, 8, 'Little')));
c'est donc cette chaine qui plante lors de la deuxième itération ( pour info : il y en a 360 et pas 361)
avant de créer la chaine , fais afficher le résultat des lire()  dans un memo+
controle le strtoint64  et le Hextodouble ...

Dom
0
darnau Messages postés 11 Date d'inscription mardi 7 novembre 2006 Statut Membre Dernière intervention 29 avril 2008
29 avril 2008 à 13:23
Ce que je ne comprend pas c'est que mon programme fonctionne parfaitement si je remplace la boucle for par un GROS copier/coller (360) des lignes suivantes:

        chaine:=HexToDouble(StrToInt64('$'+Lire(PosActual, 8,
'Little')))+''' , '''+HexToDouble(StrToInt64('$'+Lire(PosActual, 8,
'Little')));
        dm.QMBR2.close;
        dm.QMBR2.SELECTSql.Clear;
        dm.QMBR2.SELECTsql.add('INSERT INTO POINT (X, Y) VALUES ('''+chaine+''')');
        dm.QMBR2.open;
        dm.TRMBR.CommitRetaining;

Merci du temps que tu me consacres dom...

D@rNaU
0
dominique.stock Messages postés 436 Date d'inscription vendredi 7 novembre 2003 Statut Membre Dernière intervention 8 octobre 2008 7
29 avril 2008 à 14:17
?

Dom
0
darnau Messages postés 11 Date d'inscription mardi 7 novembre 2006 Statut Membre Dernière intervention 29 avril 2008
29 avril 2008 à 14:21
Je suis ravi de ne pas être le seul pour qui ce problème est une grande énigme...J'ai déjà demander à mon responsable de stage mais lui non plus n'a aucunes idées de la raison pour laquelle il y a une erreur en cas de repetitive par boucle alors quepar saisie de l'instruction X fois cela fonctionne bien.... Surtout que 361 est adapté à l'exemple sur lequel je travail actuelement pour que le programme soit compatible avec d'autre exemple il faut absolument faire une boucle for.

D@rNaU
0
darnau Messages postés 11 Date d'inscription mardi 7 novembre 2006 Statut Membre Dernière intervention 29 avril 2008
29 avril 2008 à 14:41
Je ne sais pas... Probablement je ne sais pas faire, j'ai regarder en mode Pas à Pas detaillé et j'ai donc relevé ainsi la ligne de l'erreur!

MERCI, je ne sais pas comment ca ce fait mais je vien de trouver l'erreur... J'ai fait ce que tu m'as dis j'ai regardé les données et en fait c'est la variable result de la fonction Lire qu'il faut réinitialisé à '' si on utilise une boucle for... Alors pourquoi ca marche si on n'utilise pas de boucle... Bonne question! En tout cas le programme fonctionne avec une boucle For et je te remercie pour ton aide.

Bonne continuation à tous

D@rNaU
0
Rejoignez-nous