| Autor |
Beitrag |
Akyben
Hält's aus hier
Beiträge: 12
|
Verfasst: Mo 30.11.09 11:51
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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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).
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
JoelH
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: 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.
_________________ mfg. Joel
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|