![]() |
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 |
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:
Vielleicht sollte man hier noch erwähnen, dass ein
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;
Delphi-Quellcode:
nicht dem return von PHP/C/C++ etc. entspricht. Du musst für das Setzen und gleichzeitge verlassen der Methode zwei Zeilen aufrufen:
Result := <WERT>;
Delphi-Quellcode:
Seit Delphi XE ist auch folgendes möglich:
Result := <WERT>;
Exit;
Delphi-Quellcode:
Exit(<WERT>);
|
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? |
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:
und schon geht's ;)
// Result := False;
|
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 |
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