Pobleme d'execution [Résolu]

sfkuhvdlkufgs 31 Messages postés jeudi 16 décembre 2004Date d'inscription 4 mai 2007 Dernière intervention - 10 mai 2006 à 11:09 - Dernière réponse :  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.
Afficher la suite 

Votre réponse

23 réponses

Meilleure réponse
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 11 mai 2006 à 15:36
3
Merci
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

Merci florenth 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 68 internautes ce mois-ci

Commenter la réponse de florenth
DeltaFX 459 Messages postés lundi 19 avril 2004Date d'inscription 8 avril 2009 Dernière intervention - 10 mai 2006 à 13:33
0
Merci
T'as cherché 5 minutes avant de poser la question ? mmm ?

http://www.delphifr.com/infomsg/PROBLEME-RUNTIME-ERROR-216-2_733426.aspx
Commenter la réponse de DeltaFX
sfkuhvdlkufgs 31 Messages postés jeudi 16 décembre 2004Date d'inscription 4 mai 2007 Dernière intervention - 10 mai 2006 à 14:18
0
Merci
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?
Commenter la réponse de sfkuhvdlkufgs
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 10 mai 2006 à 14:48
0
Merci
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
Commenter la réponse de florenth
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 10 mai 2006 à 16:17
0
Merci
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.
Commenter la réponse de f0xi
DeltaFX 459 Messages postés lundi 19 avril 2004Date d'inscription 8 avril 2009 Dernière intervention - 10 mai 2006 à 16:52
0
Merci
J'ai pitet été lapidaire dans ma réponse, j'ai juste tilté sur le error 216, sorry.
Commenter la réponse de DeltaFX
sfkuhvdlkufgs 31 Messages postés jeudi 16 décembre 2004Date d'inscription 4 mai 2007 Dernière intervention - 10 mai 2006 à 18:08
0
Merci
unit mol;


interface


uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart, Buttons,
DbChart;


type
TForm1 = class(TForm)
Chart1: TChart;
Series1: TLineSeries;
StaticText1: TStaticText;


StaticText2: TStaticText;
Edit1: TEdit;
StaticText3: TStaticText;
Edit2: TEdit;
StaticText4: TStaticText;
Edit3: TEdit;
StaticText5: TStaticText;
Edit4: TEdit;
StaticText6: TStaticText;
Edit5: TEdit;
Splitter2: TSplitter;
StaticText7: TStaticText;
StaticText8: TStaticText;
StaticText9: TStaticText;
Edit6: TEdit;
Edit7: TEdit;
StaticText10: TStaticText;
Splitter3: TSplitter;
Button1: TButton;
Label1: TLabel;
Edit8: TEdit;
Label2: TLabel;
Label3: TLabel;
Edit9: TEdit;
Label4: TLabel;
Label5: TLabel;
Edit10: TEdit;
Edit11: TEdit;
Label6: TLabel;
Label7: TLabel;
Edit12: TEdit;
Edit13: TEdit;
Edit14: TEdit;
Label8: TLabel;
Edit15: TEdit;
Label9: TLabel;
Edit16: TEdit;
Label10: TLabel;
Label11: TLabel;
Edit17: TEdit;
Label12: TLabel;
Edit18: TEdit;
Label13: TLabel;
Edit19: TEdit;
Series2: TLineSeries;
Label14: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;


var {par conv, A et B représentent les especes, 1 et 2 les milieux}
Form1: TForm1;


dens_pop_a , dens_nour_a, tx_abs_nour_a, dens_pop_b,
dens_nour_b , tx_abs_nour_b, supply_pool, temps, precision : string;


dpa,dn1,tana,dpb,dn2,tanb,s, coefr1,
coefr2,coefn1,coefn2, prec, pt_suiv_r1,pt_suiv_r2,
coefnA,coefnB,conv1A,conv1B,conv2A,conv2B,perteA,perteB : extended ;


i,n,c1,c2,pa1,pa2,pb1,pb2 : integer;


TNA,TNB : array of extended;


implementation






procedure TForm1.Button1Click(Sender: TObject);
begin


dpa:=strtofloat(Edit1.text); {recupération des valeurs}
dn1:=strtofloat( Edit3.text);
dpb:= strtofloat( edit2.text);
dn2:=strtofloat( Edit4.text);
S:=strtofloat(Edit8.text);
n:=strtoint(Edit9.Text);
prec:=strtofloat(Edit5.text);
pa1:=strtoint(Edit10.Text);
pa2:=strtoint(Edit11.Text);
pb1:=strtoint(Edit12.Text);
pb2:=strtoint(Edit13.Text);
conv1A:=strtofloat(Edit17.text);
conv1B:=strtofloat(Edit18.text);
conv2A:=strtofloat(Edit16.text);
conv2B:=strtofloat(Edit15.text);
perteA:=strtofloat(Edit19.text);
perteB:=strtofloat(Edit14.text);
S:=strtofloat(Edit8.text);


c1:=1;
c2:=1;


SetLength(TNA, n); {init des tableaux}
SetLength(TNB, n);


tNA[0]:=dpa;
tNB[0]:=dpb;


series1.add(dpa);
series2.add(dpb);


coefR1:=c1*(S-dn1)-(pa1*dpa*dn1+pb1*dpb*dn1);
coefR2:=c2*(S-dn2)-(pa2*dpa*dn2+pb2*dpb*dn2);


coefnA:= dpa*(pa1*conv1A*dn1+pa2*conv1B*dn2-perteA);
coefnB:= dpa*(pb1*conv2a*dn1+pb2*conv2B*dn2-perteB);



pt_suiv_r1:=prec*coefR1; {point 1}
pt_suiv_r2:=prec*coefR2;






for i:=1 to n do
begin
tna[i]:=coefna*prec+tna[i-1];
tnb[i]:=coefnb*prec+tnb[i-1];


series1.add(tna[i]);
series2.add(tnb[i]);


coefr1:=c1*(S-pt_suiv_R1)-(pa1*dpa*pt_suiv_R1+pb1*dpb*pt_suiv_r1);
coefR2:=c2*(S-pt_suiv_r2)-(pa2*dpa*pt_suiv_r2+pb2*dpb*pt_suiv_r2);


coefna:=tna[i]*(pa1*conv1A*pt_suiv_r1+pa2*conv1B*pt_suiv_R2-perteA);
coefnb:=tnb[i]*(pb1*conv2a*pt_suiv_r1+pb2*conv2B*pt_suiv_R2-perteA);



pt_suiv_r1:=prec*coefR1;
pt_suiv_r2:=prec*coefR2;


if (pt_suiv_r1<0) then pt_suiv_r1:=0; {pas de ressources négatives}
if (pt_suiv_r2<0) then pt_suiv_r2:=0; {ca ou zngi???? ou zngi est a l'equilibre}





end;



end;


begin
{$R *.dfm}
c1:=1;


with form1 do
Button1Click(form1);


end.

voila merci de votre aide
Commenter la réponse de sfkuhvdlkufgs
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 10 mai 2006 à 18:46
0
Merci
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
Commenter la réponse de florenth
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 10 mai 2006 à 18:47
0
Merci
Ah, il manque une lettre à la ligne deux : Sais-tu qu'un tableau de x éléments est indéxé depuis 0 (zéro) ?
Voila c'est tout.
Commenter la réponse de florenth
sfkuhvdlkufgs 31 Messages postés jeudi 16 décembre 2004Date d'inscription 4 mai 2007 Dernière intervention - 10 mai 2006 à 19:46
0
Merci
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
Commenter la réponse de sfkuhvdlkufgs
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 10 mai 2006 à 20:36
0
Merci
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
Commenter la réponse de florenth
cs_shining 329 Messages postés lundi 30 décembre 2002Date d'inscription 10 mars 2012 Dernière intervention - 10 mai 2006 à 20:39
0
Merci
Salut,

C'est normal que ça plante petit poucet !!!!, car si tu changes l'index ça aura donc un effet global sur tout les tableaux regit par la variable I

for i:=0 to n-1 do <==== l'index vient de changer et est un zéro
begin
...

for i:=0 to n-1 do
begin
tna[i]:=coefna*prec+tna[i-1]; <==== 0-1=-1 donc BOoooMmMmMm
tnb[i]:=coefnb*prec+tnb[i-1];

je pense plutôt que c'est ça

tna[i+1]:=coefna*prec+tna[i];
tnb[i+1]:=coefnb*prec+tnb[i];

PS: oui oui je sais tu n'es pas plutot car plutot c'est l'ami de Mickey ^^
@+
Commenter la réponse de cs_shining
cs_shining 329 Messages postés lundi 30 décembre 2002Date d'inscription 10 mars 2012 Dernière intervention - 10 mai 2006 à 20:45
0
Merci
où plutôt ça

for i:=0 to n-1 do
begin
if i>=1 then
begin
tna[i]:=coefna*prec+tna[i-1];
tnb[i]:=coefnb*prec+tnb[i-1];
end;

c'est au choix en fonction de ton programme
Commenter la réponse de cs_shining
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 10 mai 2006 à 20:45
0
Merci
Oui shining je viens de lui faire remarquer.
Mais je pense que son -1 est justifié, dans ce cas la boucle commence donc à un.

Si tu ne te plantes pas ......
tu ne pousseras jamais
Commenter la réponse de florenth
sfkuhvdlkufgs 31 Messages postés jeudi 16 décembre 2004Date d'inscription 4 mai 2007 Dernière intervention - 10 mai 2006 à 20:51
0
Merci
ben ca marche toujour pas
j'ai fait une boucle de 1 à n-1 donc plus de problème de tna[-1] (enfin je pense)

sinon sur une execution pas a pas la premiere erreur a lieux a la ligne
dpa:=strtofloat(Edit1.text); {recupération des valeurs}

la deuxieme a lieux a l'appel de la procedure button.click dans le corps du programme
merci de votre soutient
Commenter la réponse de sfkuhvdlkufgs
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 10 mai 2006 à 20:59
0
Merci
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
Commenter la réponse de florenth
cs_shining 329 Messages postés lundi 30 décembre 2002Date d'inscription 10 mars 2012 Dernière intervention - 10 mai 2006 à 23:41
0
Merci
"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 ;)

@+
Commenter la réponse de cs_shining
sfkuhvdlkufgs 31 Messages postés jeudi 16 décembre 2004Date d'inscription 4 mai 2007 Dernière intervention - 11 mai 2006 à 09:52
0
Merci
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
Commenter la réponse de sfkuhvdlkufgs
sfkuhvdlkufgs 31 Messages postés jeudi 16 décembre 2004Date d'inscription 4 mai 2007 Dernière intervention - 11 mai 2006 à 10:14
0
Merci
eh bien ça ne marche toujours pas, j'ai essayéde mettre des valeurs par défaut dans les tedits mais rien.


Sinon est-ce que le pas a pas ne remplace pas avantageusement les breakpoint ?
Commenter la réponse de sfkuhvdlkufgs
DeltaFX 459 Messages postés lundi 19 avril 2004Date d'inscription 8 avril 2009 Dernière intervention - 11 mai 2006 à 12:45
0
Merci
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.
Commenter la réponse de DeltaFX

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.