IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

un bug incomprehensible


Sujet :

Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut un bug incomprehensible
    mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var
        i: Integer
    begin
        i := 0;
    Access violation at address ..... sur le A votre avis?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Ne manquerait-il pas un point virgule après Integer?

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 621
    Points : 25 321
    Points
    25 321
    Par défaut
    Il y a surement autre chose ... une récursivité de l'appel et donc une violation d'accès me surprend j'aurais plus pensé à un débordement de pile ...

    un peu plus de code, juste celui qui plante ... que l'on puisse tester, un code le plus conci et indépendant que possible ...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    ca va etre dur j'utilise une classe que mon maitre de stage a cree...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    while (CompareDate( date, datePrec) = 0) and (va<>0) do begin
            // fill a1 with the datas of the day (datePrec)
            a1.Add(@atd);
            ReadFile( h, atd, sizeof(atd), va, nil );
            date := atd.heure;
        end;
       // for i := 0 to a1.Count-1 do begin
         // if i > 619 then begin
           // ShowMessage( ATDATA(a1.items[i]^).exchg);
         // end;
       // end;
        if CompareDate( date, datePrec ) <> 0 then begin
          if not Belongs( datePrec, a2 ) then begin
          //ShowMessage(IntToStr(Length(a1)));
            a2 := Fill( a1, a2 ); // fills a2 with the datas in a1
         //   ShowMessage( 'boucle if '+IntToStr(Length(a2)) );
            // updates l
            l.AddObject( DateToStr(datePrec), Pointer(a1.Count) );
          end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //------------------------------------------------------------------------------
    // fills a2 with the datas in a1
    function Fill( a1: TVector; a2: TVector ): TVector;
    var
      i, j: Integer;
    begin
      i := 0;
      while CompareDate( ATDATA(a2.Items[i]^).heure, ATDATA(a1.Items[0]^).heure ) < 0 do Inc(i);
      for j := 0 to a1.Count-1 do begin
        a2.Insert( i, a1.Items[j] );
      end;
     
      result := a2;
    end;
    Le bug est sur le de la fonction Fill

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 621
    Points : 25 321
    Points
    25 321
    Par défaut
    Lol, ça sens le java, ... au bureau où je suis, un collègue qui faisait du java, et réinventer, plein de truc donc les vector au lieu d'utiliser une TList ...

    bon, en plus je vois que ces Vector semble n'être que des TList, des TATDATAList, aurait été plus pratique pour éviter le Transtypage, ... il y a l'outil de Waskol, qui est bien pratique pour cela (je l'utiliserais au lieu de copier coller mon modèle pour voir une fois), ensuite plus de ^, cela éclairci le code ...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    Non parce que dans la TList il n'y a que des pointeurs alors que les TVector copient les datas!

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 621
    Points : 25 321
    Points
    25 321
    Par défaut
    Si les "Data" sont recopié, l'utilisation de pointeur est encore plus illogique ... autant avoir une liste fortement typé qui gère en interne ses pointeurs de copie et d'avoir un confort d'utilisation justifiable ...

    tient, utilisation de l'API ReadFile, moi qui passe toujours par BlockRead ou FileStream ...

    sinon as-tu essayé d'enlever une partie les lignes de code de Fill, pour voir ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function Fill( a1: TVector; a2: TVector ): TVector;
    var
      i, j: Integer;
    begin
      i := 0;
      (*while CompareDate( ATDATA(a2.Items[i]^).heure, ATDATA(a1.Items[0]^).heure ) < 0 do Inc(i);
      for j := 0 to a1.Count-1 do begin
        a2.Insert( i, a1.Items[j] );
      end;*)
     
      result := a2;
    end;

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    je viens d'essayer, le bug n'est plus la. c'est trop louche ce truc! comment il peut me signaler un bug a cause d'une partie de code situee apres ?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    plus precisement c'est a cause du while

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 621
    Points : 25 321
    Points
    25 321
    Par défaut
    Je pense que cela vient de la structure complexe du code du While, avec tous ces pointeurs, le débuggeur ne suit pas la trace, et plante avant même de t'indiquer le changement de ligne ...

    ensuite, les petis points bleu, qui indique les lignes débuggables, sont-ils bien alignés, si il traine un mélange de #10 seul et #13#10 (souvent à cause de JEDI VCS ou MS VSS), le debuggeur n'aime pas trop et se trompe de ligne ...

    sinon un petit "Assigned(A1) and Assigned(A1.Items[i]) and "... serait utile

    Ensuite sur un point de vue purement logique, il y a un problème

    si tu modifie A2 dans Fill comme c'est un objet, il est modifié, donc inutile de le renvoyer dans result ...

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    oui je sais je vais changer ca. a quoi ca sert le assigned?

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 621
    Points : 25 321
    Points
    25 321
    Par défaut
    cela Test si le pointeur est différent de nil, juste que j'écrit plus souvent assigned que <> nil, ... par contre un pointer libéré qui n'a pas été mis à nil, ne sera pas vérifié et il peut y avoir aussi des violations d'accès ...

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    ok merci

  14. #14
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Le code suivant est faux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while CompareDate( ATDATA(a2.Items[i]^).heure, ATDATA(a1.Items[0]^).heure ) < 0 do Inc(i);
    En effet si toutes les heures de Items[i] sont inférieures à celle de Items[0], on va avoir une sortie de liste, donc une erreur de violation.

    Tentative de correction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    function Fill( a1: TVector; a2: TVector ): TVector;
    var
      i, j: Integer;
    begin
      i := 0;
      while ( ( i < a2.Items.Count ) and  ( CompareDate( ATDATA(a2.Items[i]^).heure, ATDATA(a1.Items[0]^).heure ) < 0 ) ) do Inc(i);
    
     if i < a2.Items.Count
      then   for j := 0 to a1.Count-1 do begin
                a2.Insert( i, a1.Items[j] );
               end
     
      else for j := 0 to a1.Count-1 do begin
                a2.Add( a1.Items[j] );
               end;
     
      result := a2;
    end;

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Bien vu

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    exact c'etait notamment a cause de cela. j'avais aussi besoin de verifier qu'au premier passage les pointeurs n'etaient pas nuls

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bug new build ??
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 31/01/2003, 10h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo