Autor Beitrag
Akyben
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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.


ausblenden 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.

ausblenden 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.


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: 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.

_________________
mfg. Joel
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.