AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Kein Breakpoint auf result in if Abfrage möglich
Thema durchsuchen
Ansicht
Themen-Optionen

Kein Breakpoint auf result in if Abfrage möglich

Ein Thema von Necz · begonnen am 3. Mär 2011 · letzter Beitrag vom 3. Mär 2011
Antwort Antwort
Necz

Registriert seit: 22. Mai 2008
14 Beiträge
 
#1

Kein Breakpoint auf result in if Abfrage möglich

  Alt 3. Mär 2011, 19:53
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
Assembler: Tutorials,Tools,Downloads http://assembler-tutorials.pytalhost.de/
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

AW: Kein Breakpoint auf result in if Abfrage möglich

  Alt 3. Mär 2011, 19:57
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 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:
Exit(<WERT>);
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von s.h.a.r.k ( 3. Mär 2011 um 20:02 Uhr)
  Mit Zitat antworten Zitat
Necz

Registriert seit: 22. Mai 2008
14 Beiträge
 
#3

AW: Kein Breakpoint auf result in if Abfrage möglich

  Alt 3. Mär 2011, 20:02
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?
Assembler: Tutorials,Tools,Downloads http://assembler-tutorials.pytalhost.de/
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Kein Breakpoint auf result in if Abfrage möglich

  Alt 3. Mär 2011, 20:05
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 // Result := False; und schon geht's
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#5

AW: Kein Breakpoint auf result in if Abfrage möglich

  Alt 3. Mär 2011, 20:08
Du kannst die "Optimierung" über die Projektoptionen abschalten (was in diesem Fall aber nicht nötig ist)
Projekt->Optionen->Optimierung
  Mit Zitat antworten Zitat
Necz

Registriert seit: 22. Mai 2008
14 Beiträge
 
#6

AW: Kein Breakpoint auf result in if Abfrage möglich

  Alt 3. Mär 2011, 20:20
Ja stimmt, ist logisch.

Danke!
Assembler: Tutorials,Tools,Downloads http://assembler-tutorials.pytalhost.de/
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz