Fuite ou quoi !?

Résolu
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 - 10 sept. 2008 à 14:24
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 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 !

Merci a vous

20 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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;
3
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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.
3
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
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 ...

Cordialement, Bacterius !
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
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;
0

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

Posez votre question
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
10 sept. 2008 à 16:14
Ben moi ce que je vois c'est que Result est tout le temps faux ...

"if not CtrlEnRetour and not FctRetour then" conduit-il à Result := True ?

Cordialement, Bacterius !
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
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}
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
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?
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
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.

Pour le reste, je n'ai pas bien compris... 

cantador
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
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**"
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
10 sept. 2008 à 22:47
Optimisation ?
if X=99 then Break;
ha merde, le code marche pas en debuggage :/
je doute, je doute ... ^^
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
11 sept. 2008 à 10:11
De toutes façons, si tu utilises un break dans un for, autant utiliser un while
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
11 sept. 2008 à 11:13
essaye ça :

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
  X := 1;
  result := false;
  repeat
   
    inc(X);
  until result or (X > 100);
end;

<hr size="2" width="100%" />
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
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 :]
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
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).
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
11 sept. 2008 à 18:43
C'est peut être le dictateur Forman !
héhé désolé je sors ...

Sinon Francky a peut-être un truc dans sa boucle ... un truc qui est passé à travers du compilo ... et qui lui a pas plu ...

Cordialement, Bacterius !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
11 sept. 2008 à 18:44
Ah ouais pour ceux qui auraient pas compris :

Forman

For - man

For ... la boucle ...

Bon je vais me suicider.

Cordialement, Bacterius !
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
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..

cantador
0
Utilisateur anonyme
11 sept. 2008 à 20:58
@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
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
12 sept. 2008 à 10:20
merci rt 15 !
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
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...

cantador
0
Rejoignez-nous