Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Kein Breakpoint auf result in if Abfrage möglich (https://www.delphipraxis.net/158801-kein-breakpoint-auf-result-if-abfrage-moeglich.html)

Necz 3. Mär 2011 19:53

Kein Breakpoint auf result in if Abfrage möglich
 
Tag zusammen, habe folgendes Problem:

Der folgende Algorithmus springt auch bei wahrer if-Abfrage nicht in die Anweisung.
Es ist mir auch nicht möglich einen Breakpoint auf result:=true zu setzen, füge ich einen weitere
Anweisung wie z.B.: col:=6 in den Anweisungsblock, kann ich einen Breakpoint setzen.

Delphi-Quellcode:
function TSudoku.SudokuBacktrack(row,col:integer):boolean;
var
zaehl:integer;
begin
  if col = 8 then
    begin
      inc(row);

      if row=8 then        //springt nicht in if Abfrage wenn die Bedingung true ist, egal bei welcher Zahl als Bedingung für row
        begin
         result:=false;    //setzen des Breakpoints nicht möglich (wird grün, also Anweisung nicht ausgeführt)
         row:=1;           //hier ist der Breakpoint möglich
        end;
      col:=0;
    end;
  if SudokuFeld[row][col] > 0 then
    result:=SudokuBacktrack(row, col+1);
  for zaehl:=1 to 9 do
    begin
      if (CheckCol(Col,zaehl)) and (CheckRow(Row,zaehl)) and (CheckBlock(Row,Col,zaehl)) then
          begin
            SudokuFeld[row][col]:=zaehl;
            if SudokuBacktrack(row, col+1) then
              result:=true;                      //ebenfalls kein Breakpoint möglich
          end;
    end;
  SudokuFeld[row][col]:=0;
  result:=false;
end;

Um die Rekursion zu beenden müssen die if-Abfragen jedoch result:=true zurück geben.
Jemand eine Idee,wieso es nicht funktioniert?

Wäre sehr dankbar ;)

Gruß Necz

s.h.a.r.k 3. Mär 2011 19:57

AW: Kein Breakpoint auf result in if Abfrage möglich
 
Das "Problem" ist, dass der Compiler intelligent ist und sieht, dass Result später eh gesetzt wird und diese Zeile quasi gar nicht ins Programm mit eincompiliert wird.

Delphi-Quellcode:
function TSudoku.SudokuBacktrack(row,col:integer):boolean;
var
zaehl:integer;
begin
  if col = 8 then
    begin
      inc(row);

      if row=8 then
        begin
         result:=false; // Selbst wenn du hier Result setzt
         row:=1;
        end;
      col:=0;
    end;
  if SudokuFeld[row][col] > 0 then
    result:=SudokuBacktrack(row, col+1);
  for zaehl:=1 to 9 do
    begin
      if (CheckCol(Col,zaehl)) and (CheckRow(Row,zaehl)) and (CheckBlock(Row,Col,zaehl)) then
          begin
            SudokuFeld[row][col]:=zaehl;
            if SudokuBacktrack(row, col+1) then
              result:=true;
          end;
    end;
  SudokuFeld[row][col]:=0;
  result:=false; // Wird es hier überschrieben!
end;
Vielleicht sollte man hier noch erwähnen, dass ein
Delphi-Quellcode:
Result := <WERT>;
nicht dem return von PHP/C/C++ etc. entspricht. Du musst für das Setzen und gleichzeitge verlassen der Methode zwei Zeilen aufrufen:
Delphi-Quellcode:
Result := <WERT>;
Exit;
Seit Delphi XE ist auch folgendes möglich:
Delphi-Quellcode:
Exit(<WERT>);

Necz 3. Mär 2011 20:02

AW: Kein Breakpoint auf result in if Abfrage möglich
 
Sry hab nen Fehler im Quelltext gehabt, die erste Zuweisung zu result heisst: result:=true;

Jedoch verstehe ich nicht, dass beim Debuggen genau die Situation eintrifft, dass row=8 ist, und er an der if-Abfrage stoppt. Doch anstatt in die Funktion zu gehen, springt er drüber, als sei die Bedingung false. wieso?

Sir Rufo 3. Mär 2011 20:05

AW: Kein Breakpoint auf result in if Abfrage möglich
 
Gaaaaanz am Ende setzt du Result auf False.

Warum soll der Compiler Result auf irgendeinen Wert setzen, wenn der eh wieder auf False gesetzt werden soll?

Das ist Compilermagic

Kommentier die letzte Zeile aus
Delphi-Quellcode:
// Result := False;
und schon geht's ;)

WM_CLOSE 3. Mär 2011 20:08

AW: Kein Breakpoint auf result in if Abfrage möglich
 
Du kannst die "Optimierung" über die Projektoptionen abschalten (was in diesem Fall aber nicht nötig ist)
Projekt->Optionen->Optimierung

Necz 3. Mär 2011 20:20

AW: Kein Breakpoint auf result in if Abfrage möglich
 
Ja stimmt, ist logisch.

Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz