mon code:
Access violation at address ..... sur le
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 var i: Integer begin i := 0;A votre avis?
Code : Sélectionner tout - Visualiser dans une fenêtre à part i := 0
mon code:
Access violation at address ..... sur le
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 var i: Integer begin i := 0;A votre avis?
Code : Sélectionner tout - Visualiser dans une fenêtre à part i := 0
Ne manquerait-il pas un point virgule après Integer?![]()
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 ...
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !![]()
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
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) ); endLe bug est sur le
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;de la fonction Fill
Code : Sélectionner tout - Visualiser dans une fenêtre à part i := 0;
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 ...
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !![]()
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Non parce que dans la TList il n'y a que des pointeurs alors que les TVector copient les datas!
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;
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !![]()
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
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 ?
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 ...
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !![]()
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
oui je sais je vais changer ca. a quoi ca sert le assigned?
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 ...
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !![]()
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Le code suivant est faux :
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.
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);
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;
exact c'etait notamment a cause de cela. j'avais aussi besoin de verifier qu'au premier passage les pointeurs n'etaient pas nuls
Partager