Pobleme d'execution

Résolu
sfkuhvdlkufgs Messages postés 31 Date d'inscription jeudi 16 décembre 2004 Statut Membre Derniè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.

22 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
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
3
sfkuhvdlkufgs Messages postés 31 Date d'inscription jeudi 16 décembre 2004 Statut Membre Derniè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?
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
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
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
10 mai 2006 à 16:52
J'ai pitet été lapidaire dans ma réponse, j'ai juste tilté sur le error 216, sorry.
0
sfkuhvdlkufgs Messages postés 31 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 4 mai 2007
10 mai 2006 à 18:08
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
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
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
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
10 mai 2006 à 18:47
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.
0
sfkuhvdlkufgs Messages postés 31 Date d'inscription jeudi 16 décembre 2004 Statut Membre Derniè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
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
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
0
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
10 mai 2006 à 20:39
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 ^^
@+
0
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
10 mai 2006 à 20:45
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
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
10 mai 2006 à 20:45
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
0
sfkuhvdlkufgs Messages postés 31 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 4 mai 2007
10 mai 2006 à 20:51
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
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
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
0
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 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 ;)

@+
0
sfkuhvdlkufgs Messages postés 31 Date d'inscription jeudi 16 décembre 2004 Statut Membre Derniè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
0
sfkuhvdlkufgs Messages postés 31 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 4 mai 2007
11 mai 2006 à 10:14
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 ?
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
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.
0
sfkuhvdlkufgs Messages postés 31 Date d'inscription jeudi 16 décembre 2004 Statut Membre Derniè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.
0
Rejoignez-nous