Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Compiler ueberspringt Funktion


Akyben - Mo 30.11.09 11:51
Titel: Compiler ueberspringt Funktion
Hallo Delphi Gemeinde,

mein Compiler ueberspringt beim Debuggen immer eine Anweisung "result := wert;" in Zeile 19 und ich weiss nicht warum. Also ich habe ein Bewertungsfunktion, beim dem Steine von einer Farbe auf dem Spielbrett gezaehlt werden.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
function TForm1.Eval_Spielbrett(Spielbrett: Grundspielbrett; Farbe: Integer): integer;
var Wert: integer;
    i: integer;
    Gegnerfarbe : integer;
begin
  Wert := 0;
  Gegnerfarbe := SCHWARZ + WEISS - Farbe;
  for i := 0 to High(spielbrett) do
    begin
      if Spielbrett[i] = Farbe then
        begin
          wert := wert + 3;
        end
      else if Spielbrett[i] = Gegnerfarbe then
        begin
          wert := wert - 3;
        end;
    end;
  result := wert;
end;


Den Rueckgabewert von Eval_Spielbrett lass ich dann als Test in einem Label anzeigen.


Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.caption :=IntToStr(Eval_Spielbrett(brett,WEISS));
end;


Wenn ich die Anweisung in die Schleife mit einschliesse, dann bekomme ich meinen Rueckgabewert der Funktion.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
function TForm1.Eval_Spielbrett(Spielbrett: Grundspielbrett; Farbe: Integer): integer;
var Wert: integer;
    i: integer;
    Gegnerfarbe : integer;
begin
  Wert := 0;
  Gegnerfarbe := SCHWARZ + WEISS - Farbe;
  for i := 0 to High(spielbrett) do
    begin
      if Spielbrett[i] = Farbe then
        begin
          wert := wert + 3;
        end
      else if Spielbrett[i] = Gegnerfarbe then
        begin
          wert := wert - 3;
        end;
      result := wert;
    end;  
end;



Meine Frage warum optimiert der Compiler diese Anweisung oder bin ich blind und sehe meinen Fehler nicht?
Gibt es eine Moeglichkeit die Compileroptimierungen zu deaktieren?

Gruss Akyben


BenBE - Mo 30.11.09 12:07

Der Compiler erkennt, dass er Wert bereits im Quelltext durch Result austauschen kann. Daher ist die Zuweisung am Ende nicht mehr nötig.

Das Abschalten der Optimierungen ist zwar über die Projekt-Optionen (--> Compiler) möglich, aber i.d.R. eine schlechte Idee. Zum einen wird die Anwendung dadurch wesentlich langsamer und zum anderen findet man auf diese Weise recht einfach, wo man Müll programmiert (mit Compiler-Optimierungen neigen einige Konstrukte, die sinnlos oder fehlerhaft sind, eher dazu als Fehler aufzufallen).


JoelH - Mo 30.11.09 15:25

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Der Compiler erkennt, dass er Wert bereits im Quelltext durch Result austauschen kann. Daher ist die Zuweisung am Ende nicht mehr nötig.

Das Abschalten der Optimierungen ist zwar über die Projekt-Optionen (--> Compiler) möglich, aber i.d.R. eine schlechte Idee.

Zum einen wird die Anwendung dadurch wesentlich langsamer

Naja, Geschmacksache, denn erstens ist Debuggen im Einzelschrittmodus ist meist eh nicht zeitkritisch ;)
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:

und zum anderen findet man auf diese Weise recht einfach, wo man Müll programmiert (mit Compiler-Optimierungen neigen einige Konstrukte, die sinnlos oder fehlerhaft sind, eher dazu als Fehler aufzufallen).


Und zweitens ist lesbarer Code alles andere als Müll. Find ich wenigstens.

Des Weiteren kann man ja sowohl eine Debug-Version als auch eine Release-Version kreieren, so mach ich, zum Debuggen wird alles eingeschaltet, zum Release dann alles aus und Optimize ein.


BenBE - Mo 30.11.09 16:17

Naja, es geht darum, dass man sich angewöhnt, nicht unnötig verbosen Code zu schreiben. DRY (Don't Repeat Yourself) ist nicht umsonst eine recht gute Beschreibung dessen, was man üblicherweise tun sollte: Möglichst kurz und präzise seinen Code schreiben, ohne übermäßig viele Variablen hin und her zu jonglieren.

Richtig, man sollte dabei nicht unbedingt in guter IOCCC-Manier alles nur erdenkliche zur Verkürzung eines Ausdrucks unternehmen, aber wenn man ein gesundes Maß an Optimierungen bereits beim Schreiben einfließen lässt, wird der Source um einiges einfacher.