sfkuhvdlkufgs
Messages postés31Date d'inscriptionjeudi 16 décembre 2004StatutMembreDernière intervention 4 mai 2007
-
10 mai 2006 à 11:09
Tituit2007 -
28 déc. 2007 à 19:44
Bonjour,
alors voila, je doit afficher un graphique a l'ecran, qui est le résultat de paramètres entrés par l'utilisateurs dans des tedit.
le probleme est que ça compile, ça se construit mais l'execution me fait des erreurs :
"Le projet project1.exe a provoqué une classe d'exeption EAccessViolation avec le message d'accès a l'adresse004834EF dans le module 'project1.exe'. Lecture de l'adresse 00000308. Processus stoppé. Utilisez pas a pas ou executer pour continuer."
je clique sur OK et j'essaye de cntinuer l'execution, et la il met une autre erreur : "Runtime error 216 at 0040327E"
voila la structure de mon programme :
type
tform1=class (Tform)
mes edits...
series1 : TlineSeries
Button1 : TButton {le bouton qui sert a valider une fois que les parametres sont entrés}
+dif variables
Procedure Button1Click(sender : Tobject)
private
public
end;
var
form1 : tform1
a:string
b:string
etc...
implementation
procedure tform1.Button1Click(sender : Tobject)
begin
recuperation des valeurs des tedits puis series1.add (a:=strtofloat( edit1.text)) etc...;
end
begin
with form1 do
Button1Click(form1);
end
voila donc en gros, tout se fait dans la procédure buttonclick, au moment ou l'utilisateur clique sur le bouton de vlidation.
désolé pour la longueur...
merci de votre aide.
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 11 mai 2006 à 15:36
Au fait, pourquoi appelles-tu la procédure Button1Click() manuellement ?
Normalement, elle n'est sencée se produire uniquement quand l'utilisateur clique sur le bouton, non
sfkuhvdlkufgs
Messages postés31Date d'inscriptionjeudi 16 décembre 2004StatutMembreDernière intervention 4 mai 2007 10 mai 2006 à 14:18
euh... ben la en fait je suis pas sur que sa m'aide
je ne suis dans aucuns des cas du post (pentium4 >3Ghz), et franchement je pense que le probleme vient plus de mon code.
peut etre est-ce lié a la premiere erreur?
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 10 mai 2006 à 14:48
En effet, je pense que le problème vient d'abord de ta procédure.
Pourquoi ne pas l'avoir posté en entier plutot que sommairement nous la décrire ?
Sans code, difficile de débugger ...
Si tu ne te plantes pas ......
tu ne pousseras jamais
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202234 10 mai 2006 à 16:17
les violation d'accés sont des erreurs difficile a determiner tel quel ...
en regle generale elle surviennent avec l'utilisation de pointeur ou de mauvais passage de parametre ou encore a l'initialisation d'objet créés dynamiquement.
par exemple si on tape :
procedure ....
begin
Button1.create(self);
end;
il y a de forte chance pour qu'une erreur de violation apparraisse.
on ecrit donc :
Button1 := TButton.Create(Self);
pour les objets a créer dynamiquement uniquement ... pour les autres possibilitée, il y en as tellement que toute les decrirent serait long ... trés long.
Vous n’avez pas trouvé la réponse que vous recherchez ?
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 10 mai 2006 à 18:46
Héhé, je t'avais dit qu'avec un code, ça ira 10 fois mieux.
Sais-tu qu'un tableau de x éléments est indéxé depuis ?
Et donc que son dernier élément à l'index x - 1 ?
Aparament non.
Voila ce qui cloche.
for i:=1 to n do
est à rmplacer par
for i := 0 to n - 1 do
Ah tiens, tant que j'y suis, nomme tes composants.
Parce que là, sans regarder, dis moi à quoi sert l'Edit13 ! Alors ?
Et si tu avais par exemple EdtTelephone tu saurais que l'edit contient un numéro de téléphone...
++
Si tu ne te plantes pas ......
tu ne pousseras jamais
sfkuhvdlkufgs
Messages postés31Date d'inscriptionjeudi 16 décembre 2004StatutMembreDernière intervention 4 mai 2007 10 mai 2006 à 19:46
ah oui ....
bon j'ai changé ça, mais sa marche pas mieux.
sinon j'ai pas renomé mes tedits parce que je m'en sert juste une fois dans le programme et donc je n'ai pas trouvé sa utile.
Merci beaucoup
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 10 mai 2006 à 20:36
Ah zut, j'avais mal lu le code.
Tu commence ta boucle qu'a partir de la deuxième case.
donc il faut for I := 1 to N - 1 do et non pas 0 comme je te l'ai dit (j'avais pas compris ce que tu faisait, désolé).
Sinon, tout le reste du code ne comporte que des multiplications et des additions, ça devrait marcher.
Si c'est pas le cas, tu fais signe, et si ça marche, tu valide la réponse.
++
Si tu ne te plantes pas ......
tu ne pousseras jamais
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 10 mai 2006 à 20:59
Si l'Edit1 ne contient pas un nombre décimal, cette erreur est générée. Mais normalement, il s'agit d'une exception ...
En tout cas, saches que tu ne doit pas te tromper dans le séparateur décimal (point ou virgule), qu'il ne doit pas y avoir de séparateur de milliers et que la notaiton scientifique s'écrit sous laforme 2.33e+5 par exemple
++
Si tu ne te plantes pas ......
tu ne pousseras jamais
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 10 mai 2006 à 23:41
"Runtime error 216 at 0040327E" <=== c'est une erreur de violation d'accès memoire !!!, les raisons peuvent être multiples !!!
- pointeur invalide
- accès à un tableau en dehors de la plage mémoire
- index supérieur où inférieur à la plage mémoire du tableau
- problème d'HyperThreading d'un CPU Intel
ect...
voici une liste non-exhausive des erreurs fréquemment rencontrés !!!
n° Exception
200 Division by zeroEDivByZero
201 Range check errorERangeError
202 Stack overflowEStackOverflow
203 Heap overflow errorEOutOfMemory
204 Invalid pointer operationEInvalidPointer
205 Floating point overflowEOverflow
206 Floating point underflowEUnderflow
207 Invalid floating point operationEInvalidOp
210 Abstract Method ErrorEAbstractError in CLX, Program terminates.
215 Arithmetic overflow (integer only)EIntOverflow
216 Access violationEAccessViolation
217 Control-CEControlC
218 Privileged instructionEPrivilege
219 Invalid typecastEInvalidCast
220 Invalid variant typecastEVariantError
221 Invalid variant operationEVariantError
222 No variant method call dispatcherEVariantError
223 Cannot create variant arrayEVariantError
224 Variant does not contain arrayEVariantError
225 Variant array bounds errorEVariantError
226 TLS initialization errorNo exception to map to.
227 Assertion failedEAssertionFailed
228 Interface Cast ErrorEIntfCastError
229 Safecall errorESafecallException
230 Unhandled exceptionNo exception to map to.
231 Too many nested exceptionsUp to 16 permitted.
232 Fatal signal raised on a non-Delphi threadNo exception to
la solution ??
- mettre des break-points dans des endroits stratégiques !!!
- utiliser MemCheck ?!?
pour les endroits statégiques ....
type
TForm1 = class(TForm)
...........
perteB:=strtofloat(Edit14.text);
S:=strtofloat(Edit8.text);
mettre un BP ici si ça plante avant ya un prob avec les TEdit (mais je ne pense pas)
c1:=1;
c2:=1;
....
mettre un BP là si tout va bien --->
coefR1:=c1*(S-dn1)-(pa1*dpa*dn1+pb1*dpb*dn1);
mettre un BP là
coefR2:=c2*(S-dn2)-(pa2*dpa*dn2+pb2*dpb*dn2);
mettre un BP ici et lancer l'application, si tout va bien -->
for i:=1 to n do
begin
tna[i]:=coefna*prec+tna[i-1];
tnb[i]:=coefnb*prec+tnb[i-1];
mettre un BP ici et lancer l'application si tout va bien --->
series1.add(tna[i]);
mettre un BP ici et lancer l'application
series2.add(tnb[i]);
et après donne nous le resultat !!!
PS : BP = Break Point bien entendu :]
et si malgré ces efforts le bug persiste bah ma foi... refait tout le projet proprement ;)
sfkuhvdlkufgs
Messages postés31Date d'inscriptionjeudi 16 décembre 2004StatutMembreDernière intervention 4 mai 2007 11 mai 2006 à 09:52
En fait je pense avoir trouvé (on se calme rien de sur encore...), le truc c'est que le programme plante avant memed'afficher ce qui doit l'etre et que la procedure button1.click est lancé quand même (rien d'affiché pourtant donc pas de boutons clické). Il essaye donc de récuperer des valeurs dans les tedits alors qu'il ny a rien.
jessaye de voir ça et vous tient au courant
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 11 mai 2006 à 12:45
Juste mes 0.02? mais pour un prog, j'ai eu besoin d'un StrtoFloat.... j'ai jamais pu faire marcher ce truc (strtofloat) donc je l'ai réécrit à ma sauce:
Essaiede remplacer temporairement les instruction STRTOFLOAT par :
function StrToXtd(Chaine,DecSep :string):extended;
var L,K,i: integer;
R:extended;
begin
R:=0;
L:=Length(Chaine);
K:=Pos(DecSep,Chaine);
For i:=1 to L do
if Chaine[i] in ['0'..'9']
then R:=R*10.0 + StrToInt(Chaine[i]);
if K > 0 Then R:=R/IntPower(10,(L-K));
if Pos('-',Chaine) > 0 then R:=R*(-1);
Result:= R;
end;
Il gere pas les notations scientifiques (les E de base 10). Mais là tu peux lui dire clairement quel est le séparateur décimal. Le resulat est 0 par defaut.
sfkuhvdlkufgs
Messages postés31Date d'inscriptionjeudi 16 décembre 2004StatutMembreDernière intervention 4 mai 2007 11 mai 2006 à 16:14
ben en effet oui ca marche mieux sans ^^
mais du coup le corp du prog est vide ?!!
la fenetre se lance, mais appuyer sur le bouton valider ne lance pas le dessin du graphe.
en tout cas merci beaucoup parce que la je voyais pa d'ou cela pouvait venir.