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
BenBE hat folgendes geschrieben : |
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 ;)
BenBE hat folgendes geschrieben : |
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!