Comment identifier l'origine de "EAccessViolation" ?

Comment identifier l'origine de "EAccessViolation" ? - Delphi/Pascal - Programmation

Marsh Posté le 26-04-2011 à 18:13:14    

Bonjour à tous :)
 
J'ai ce message qui apparaît, régulièrement et au même endroit de mon prog :  
 
http://hfr-rehost.net/self/pic/005544cfe03234e0facfb9e99e7f2297ab953f28.png
 

Code :
  1. SetLength(Tab_Char, Surface_Fiche_Ds_Base);  // Alloc du Tab dynamique de char
  2. Ptr_Tab_Char := addr(Tab_Char[0]);  // Ptr_Tab_Char pointe sur le début de Tab_Char
  3. Move(Ptr_Mob_Buffer_Base_Concatenee^, Ptr_Tab_Char^ , Surface_Fiche_Ds_Base); // Copie d'un bloc mémoire dans Tab_Char


 
Le principe : 1 - allocation de Tab_Char : lui donne la surface mémoire désignée par Surface_Fiche_Ds_Base
                 2 - Move : je copie la source (un bloc mémoire) ds Tab_Char
                 3 - je cherche une chaîne
                 4 - je désalloue systématiquement Tab_Char par SetLength(Tab_Char, 0)
                 5 - On revient à 1
 
et ainsi de suite.  
 
J'ai l'impression que c'est une erreur d'allocation mémoire. Mais comment diagnostiquer une erreur de ce type ? Quelle routine utiliser ?  
 
Merci :)

Reply

Marsh Posté le 26-04-2011 à 18:13:14   

Reply

Marsh Posté le 26-04-2011 à 21:59:14    

Ce type d'erreur peut apparaître pour des raisons très variées.
 
Donc, comme toujours quand on débugue, il ne faut pas avoir d'idée préconçues.
Il faut relire son code soigneusement et recueillir des informations, par exemple en mettant des traces dans le programme, pour les étudier quand le problème surviendra.
 
Le mot "désalloue" en gras me fait un peu peur, car j'ai déjà vu des programmeurs qui ont fait des erreurs en voulant être trop "propres". En fait, le problème survenait parce qu'il y avait trop de désallocations. Donc, il ne faut pas faire de choses "systématiquement", mais faire les choses intelligemment, et c'est plus facile à dire qu'à faire.
 
Bon courage.

Reply

Marsh Posté le 27-04-2011 à 00:38:34    

billgatesanonym a écrit :

Ce type d'erreur peut apparaître pour des raisons très variées.
 
Donc, comme toujours quand on débugue, il ne faut pas avoir d'idée préconçues.
Il faut relire son code soigneusement et recueillir des informations, par exemple en mettant des traces dans le programme, pour les étudier quand le problème surviendra.
 
Le mot "désalloue" en gras me fait un peu peur, car j'ai déjà vu des programmeurs qui ont fait des erreurs en voulant être trop "propres". En fait, le problème survenait parce qu'il y avait trop de désallocations. Donc, il ne faut pas faire de choses "systématiquement", mais faire les choses intelligemment, et c'est plus facile à dire qu'à faire.
 
Bon courage.


J'ai pensé à ça aussi :( J'ai laissé la désalloc finale du Tab_Char, et enlevé toutes les réallocs. C'est le même pb : au 76 ième passage dans la boucle, plantage.  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed