Newsgroup: it.comp.lang.delphi
Titolo: Bug optimization ... ?

Premesso che sono alle prime armi con Delphi (arrivo da una breve esperienza
con C++ Builder) sono rimasto
particolarmente sorpreso da un comportamento curioso di D7 Ent con
Optimization a ON:
---
procedure TForm1.Button1Click(Sender: TObject);
var
BoolNewYear : Boolean;
IntThisYear : Integer;
begin
    BoolNewYear := false;
    if    BoolNewYear then
    begin
        IntThisYear := 2003;
    end
    else
    begin
        IntThisYear := 2004;
    end;
end;
end.
---
Con l'ottimizzazione settata il test della variabile BoolNewYear non viene
eseguito.
Da una breve ricerca sul NG ho trovato solo riferimenti di buig simili su
cicli for ma nulla relativo all' if.
Qualche info al riguardo ?
Grazie
Luigi

 Luigi
Ciao
Andrea
P.S. Ma leggere la documentazione no?

 P.S. Ma leggere la documentazione no?
Magari l'ho letto distrattamente ma in Programmare in D6 di MC non mi sembra
di aver visto riferimenti a
queste particolarità dell'ottimizzazione.
Ti assicuro che prima di postare sul NG ho fatto il possibile per cavarmela
da solo, anche con ricerche su
comp.lang.pascal.delphi.*
Grazie per la risposta

 su cicli for ma nulla relativo all' if. Qualche info al riguardo ?
Le info le trovi da solo se ragioni logicamente:
Il tuo codice può essere tradotto in questo modo:
     if false then
	pippo
     else
	pluto;
non è quindi un bug, ma una ottimizzazione, perchè non c'è proprio
bisogno di valutare un "if false then pippo" perche non verrà MAI
eseguito. 

 ha scritto nel messaggio
news:auulso$a7472$1...@ID-159373.news.dfncis.de...

Beh allora mi aspettavo che almeno l'else pluto venisse eseguito ... perchè
anche se la var è True non esegue
il then pippo ...
Ho visto che se però "uso" la var nel test ad esempio con una Label1.Caption
:= IntToStr(IntTHisYear); allora viene eseguito,
quindi l'ottimizzatore è "particolarmente sensibile" all'uso delle variabili
nel test e/o nei cicli. ( cosa che non mi pareva
di aver riscontrato su BC++)

     end;
BoolNewYear č sempre falso. Sarebbe pertanto inutile compilare l'ife la
condizione "then".
Dovrebbe quindi eseguirti solo la parte nell'else.
Ossia il tuo codice riassunto sopra diventa:
     BoolNewYear := false;
     IntThisYear := 2004;
Ciao,
  Luca

 di aver riscontrato su BC++)
Mi spiego meglio, cosě funziona :
-----
var
BoolNewYear : Boolean;
IntThisYear : Integer;
begin
    IntThisYear := 0;
    BoolNewYear := True;
    if    BoolNewYear then
        IntThisYear := 2003
    else
        IntThisYear := 2004;
    Label1.Caption := IntToStr(IntTHisYear);
end;
-----
... se invece commento la Label1.Caption := IntToStr(IntTHisYear);  il then
(ma nemmeno l'else in caso di false) non viene
eseguito e guardando l'asm si nota che non viene nemmeno generato il codice
per il set a 2003 (o 2004) di
IntThisYear e a fine procedura il debug mi dice che la variabile non č
accessibile "... due to optimization".
Evidentemente questo č un codice d'esempio ma ho gli stessi problemi su un
prj con delle variabili usate nella procedura e che
non sono oggetto di visualizzazione su forms o altro.
Sperando di esser stato + chiaro, cortesemente, fatemi capire dove sbaglio.
Grazie

   Luca
Grazie e ciao.

 Preciso ancora che uso D7Ent build 4.453, opzioni standard.
Adesso ti dico anche il perché.
Č inutile.
Che la setti o meno non viene usata in nessun altro luogo nel programma...
quindi viene eliminata automaticamente _anche_ in fase di debug.
Ciao,
  Luca

 quindi viene eliminata automaticamente _anche_ in fase di debug.
Delphi è molto "intelligente", se vede che una variabile è inutile lui la
toglie.. incluse tutte le istruzioni che la manipolavano.
I pallini blu (quelli che compaiono a fianco del codice una volta compilato)
servono proprio a dirti quali istruzioni sono state convertite in assembly e
quali invece no (perché inutili).
Non si tratta quindi di un bug, ma del normale (e auspicabile) funzionamento
otimizzato di Delphi.
Ciao,
  Luca

 Grazie per la risposta
Ciao :)
Andrea

o con qualcuno del DedTeam( tutti molto bravi ).
Insomma in questo ng siamo tutti dei benemeriti
cazzoni...  :-)

viene generata una DEC.
Il motivo non e` questo: le sottrazioni, in assembly, vengono
generalmente trasformate in addizioni con complemento a 2, quindi la
velocita` di esecuzione e` la stessa.  Il motivo di quella
trasformazione e` che si utilizza un registro di flag per testare
l'avvenuta fine del ciclo e non un'istruzione di confronto diretta,
quindi, in soldoni, un'istruzione in meno.