JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 2010
-
10 sept. 2008 à 14:24
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 2021
-
12 sept. 2008 à 11:38
Bonjour tout le monde !
Je travaille sur un gros projet (professionnel, 300k lignes de code) et je me retrouve depuis ce matin avec des abérations de debugger, exemples :
for X:=1 to 100 do
...
je debugg ici et X vaut 100 ... pourquoi pas 1 ?
puis la boucle continue tout de même, de 100 à 1 ... comme un downto !??
Dans cette boucle j'ai une vérification booleenne, exemple :
if Controle then
...
Controle vaux VRAI, dès la 2eme boucle (X=99 ...) Controle vaux FAUX !
Et rien dans cette boucle ne modifie ça, de toute façon, Controle est une constante !!!!!
Forcement, après compilation,(hors débugger, hors IDE), le comportement n'est pas normal. je devrais avoir tel comportement mais j'en ai un autre >_<
Comment est-ce possible qu'une boucle merde à ce point et que des constante soient modifiées !
Je ne peux pas vous donner de morceau de code concret, après, je vous dis, c'est qu'une boucle for ....
J'ai bien sur rebooté le pc au cas ou les barrettes étaient dans la semoule mais idem.
Par contre, si je ne suis pas dans ce projet, mes boucles sont niquels.
Comment etre sur de la source du problème ? comment résoudre ce problème ? Comment savoir si j'ai des fuites ou autre !
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 12 sept. 2008 à 10:08
Salut,
Je sais juste pourquoi parfois, certains compilos inversent les boucles dans le but d'optimiser les performances
for i:= 0 to 5 do
01 mov ecx, 0 // i:= 0
02 nop // Corps de la boucle
03 inc ecx // i:= i + 1
04 cmp ecx, 5 // Compare i et 5
05 jne 02 // Saute si i <> 5
06 nop // Après la boucle
01 mov ecx, 5 // i:= 5
02 nop // Corps de la boucle
03 dec ecx // i:= i - 1
04 jnz 02 // Saute vers l'instruction 2 si i <> 0
05 nop // Après la boucle
(Ecris en vitesse, j'ai peut être foiré le nombre de tours, mais l'esprit est là)
La première solution est la plus logique, la deuxième solution est la plus rapide (Une instruction de moins). La deuxième est basée sur le fait que quand on arrive à zéro, pas la peine de faire une comparaison : quand la dernière instruction a pour résultat 0, un flag du processeur est activé. On peut donc faire le saut en se basant sur ce flag.
J'ai pas tout luce topic, donc je vais me faire taper. Pour contrer une boucle à l'envers, on peut ajouter notre propre indice bien sûr :
j:= 0;
for i:= 0 to n do
begin
Tab[j]:= ...;
Inc(j);
end;
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 12 sept. 2008 à 10:36
De re après une lecture plus attentive.
A la question "pourquoi le compilo retourne parfois une boucle, parfois pas ?", je répondrait qu'il va étudier le cas de la variable de la boucle. Si elle est utilisée dans le corp de la boucle, il ne va pas la retourner (Ou alors il va introduire une nouvelle variable pour la boucle... Je n'ai cependant jamais vu de compilo faire ça).
Plus clairement :
// Peu importe la valeur de i dans la boucle, on retourne la boucle si on veut
for i:= 0 to 5 do begin end;
// i est utilisé : on ne peut pas retourner
for i:= 0 to 5 do begin ShowMessage(IntToStr(i)); end;
<hr />
Cela dit, une boucle peut foirer complètement et on peut avoir des résultats incohérents (Constante qui ne le sont plus par exemple) sans que le compilo soit en cause.
Cela peut se produire en cas de dépassement de tampon, un appel d'une dll avec une convention d'appel invalide...
Dans la majorité des cas, c'est la pile qui devient incohérente, et les variables locales peuvent se mettre à contenir n'importe quoi (Souvent la valeur d'autres variables, c'est assez comique parfois).
Dans ces cas là, c'est souvent très chiant à débuguer. A part commenter des parties du corps de la boucle pour isoler le problème, ou utiliser la fenêtre de débogage de la CPU, y a pas de solution miracle.
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 10 sept. 2008 à 16:00
Pourrais-tu montrer l'intégralité du code qui ne marche pas ? y compris les composants sur la fiche, l'unité de la fiche, et l'unité du projet ? Ca ne doit pas venir de l'IDE mais d'un truc quelconque qu'il faut trouver ...
Ou alors un bug de l'IDE ? ça m'etonnerait ...
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 10 sept. 2008 à 16:11
Je ne suis pas sur une fiche, juste dans une unité utilisée via uses.
Je ne peux pas donner de code (c'est professionnel), je t'épure ce que ça donne en gros :
function MaFunction(const NumRef: Integer; const Ref: string; const CtrlEnRetour: Boolean False; const NumLig: Integer 0; const FctRetour: Boolean = False): Boolean;
var X: Integer;
begin
Result:= False;
for X:= 1 to 100 do
begin
if not CtrlEnRetour and not FctRetour then
.......
if Result then
Break;
end;
end;
Vous n’avez pas trouvé la réponse que vous recherchez ?
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 10 sept. 2008 à 16:55
On s'en fout ! Je donne pas tout le code, imagine toi ça (dessous) et basta, là n'est pas le problème, pourquoi une for...to
fait l'effet d'un for..downto en debugger
if not CtrlEnRetour and not FctRetour then
Result:= {blablabla}
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 10 sept. 2008 à 21:03
as tu essayé de faire des tests autres que par l'evaluateur?
genre :
function MaFunction(const NumRef: Integer;
const Ref: string; const CtrlEnRetour: Boolean = False; const NumLig:
Integer 0; const FctRetour: Boolean False): Boolean;
var X: Integer;
begin
Result:= False;
for X:= 1 to 100 do
begin
OutputDebugString(IntToStr(X));
if not CtrlEnRetour and not FctRetour then
.......
if Result then
Break;
end;
end;
As tu regardé les conseils/avertissements si il y en a ?
Es tu sur que c'est la bonne unité?
si ca se trouve, tu as 2 unités de meme nom, et il t'affiche pas celle qui correspond reellement à la compilation (sisi, ca arrive). Ca se voit en ajoutant des sauts de lignes par exemple, et en regardant si les petits points bleus dans la marge (dans D7 en tout cas) correspondent bien a des instructions.
As tu essayé d'acive/desactiver l'optimisation?
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 10 sept. 2008 à 22:09
bonsoir,
pour le coup de la boucle à l'envers, cela m'arrive aussi quelquefois..
mais sans déclencher pour autant d'anomalie dans les calculs..
C'est tout simplement le compilateur, qui préfère, pour de questions d'optimisation tourner dans l'autre sens.
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 10 sept. 2008 à 22:27
"C'est tout simplement le compilateur, qui préfère, pour de questions d'optimisation tourner dans l'autre sens."
J'aimerai bien savoir par quel mécanisme le compilateur prend la décision de retourner le sens de la boucle. Surtout que la boucle a pas l'air d'être des plus simples. Ça me semble bizarre qu'il puisse dire "tiens, j'vais retourner la boucle pour le fun, il va s'amuser pour comprendre c'qu'il se passe ce c**"
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 11 sept. 2008 à 14:15
Comme le while, ça marche bien ça f0xi. Le truc c'est que je suis dans un for et je ne "peux pas" mettre autre chose ^^
Bon, et bien, mystère, personne en sait donc pourquoi une boucle tourne à l'envers en debugage et tout le monde me propose des solutions non demandées ^^ tsss honteux :]
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 11 sept. 2008 à 18:36
"je ne "peux pas" mettre autre chose"
Quand on veut on peut
J'aimerai bien savoir quel genre de dictateur t'empeche de remplacer un for par un while !!!
Sinon j'ai fait le test suivant:
for x := 1 to 100 do
begin
if x = 99 then
break;
end;
avec ou sans l'optimisation, ca tourne toujours a l'endroit (avec le compilateur D7 en tout cas).
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 11 sept. 2008 à 18:50
@guillemouze :
"tiens, j'vais retourner la boucle pour le fun..."
ben oui et pourtant, c'est vrai, mais pour pas le fun, parce que à ce moment là
ça l'arrange..
@Bacterius : "
Sinon Francky a peut-être un truc dans sa boucle" : chez pas si j'ai un truc dans ma boucle mais toi tu as une fuite systeme . Si tu veux tant m'aider je t'invite à te plonger sur ma question qui est quelque pas apres
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 12 sept. 2008 à 11:38
(Souvent la valeur d'autres variables, c'est assez comique parfois).
Oui, j'ai justement le cas après avoir déclaré un tableau en constante :
Const
SGroupe: array[0..7] of string = ('ENV', 'GIT', 'GMS', 'N-C', 'SG', 'SOA', 'SRI', 'TCH');
et quand je débugge dans une boucle, il m'affiche des valeurs d'un autre tableau !
et le programme fonctionne nickel chrome...