![]() |
Compiler will mich vera*** ??
Liste der Anhänge anzeigen (Anzahl: 4)
Hi!
Seht euch bitte mal folgenden Code an:
Delphi-Quellcode:
Das Feld FField('K',True) liegt auf 5/1, und eigentlich sollte er da auch abbrechen -> break. Aber jetzt kommt das beste: Er geht nichtmal in die THEN-Zeile!!!
function TBoardForm.KingInDanger(FField: RField): Boolean;
var (...) KingPos: TPoint; CurPos: TPoint; i,j: Integer; begin result:=False; for i:=1 to 8 do for j:=1 to 8 do begin KingPos.X:=j; KingPos.Y:=i; if (FField[KingPos.X,KingPos.Y].Name='K') and (FField[KingPos.X,KingPos.Y].White=UserWhite) //das hier erkennt er nicht!? then break; end; (...) end; Drei Screens liegen bei (aus dem UnitCode (mit Breakpoints)) die drei Screens sind aufeinanderfolgend, also da ist kein Schritt dazwischen (Stop-F8-F8)! Man beachte die überprüften Werte der Variablen! Kann mir irgendjemand sagen, was daran falsch ist!? der Code lautet danach wie folgt weiter:
Delphi-Quellcode:
Und so seltsam es ist, hier funktionierst, wenn OppFig.White <> UserWhite ist!??
for i:=1 to 8 do
for j:=1 to 8 do begin CurPos.X:=j; CurPos.Y:=i; OppFig:=FField[CurPos.X,CurPos.Y]; if (OppFig.Name>'') and not(OppFig.White = UserWhite) then begin if (FigureCanMove(OppFig.Name,CurPos,KingPos)) then begin result:=True; exit; end; end; end; Ich habe auch schon versucht statt [KingPos.X,KingPos.Y] [j,i] zu schreiben, bzw. so, wie im Nachfolgenden Code das Feld temporär zu speichern mit KingFig:=FField[KingPos.X,KingPos.Y], bzw. KingFig:=FField[j,i] - alles vergebllich. Es liegt auch nicht am Namen, denn mit dem folgenden Code komme ich in die erste THEN-Behandlung, aber bei dem White=UserWhite Vergleich will er wieder nicht!?
Delphi-Quellcode:
if (FField[KingPos.X,KingPos.Y].Name='K') then //hier kommt er rein
if (FField[KingPos.X,KingPos.Y].White=UserWhite) //hier spinnt er = er denkt (...).White wäre <> UserWhite then break; |
Re: Compiler will mich vera*** ??
das hat nix mit verarsche zu tun. Für den Compiler ist die gesamte If-Anweisung eine Anweisung, Zeilenumbrüche werden nicht berücksichtigt!! Es kommt also aufs gleiche raus ob du das alles auf 5 zeilen verteilst oder auf einer zeile hast, es gibt immer nur den einen Haltepunkt. Wenn du wissen willst ob ein teilausdruck erfüllt ist so setze den haltepunkt bei der if-Anweisung und befördere den Teilausdruck in die Watches (View-Debug Windows->Watches (überwachte Ausdrücke)). Alternativ kannst du auch die If-Anweisung mit den zwei Bedingungen zu 2 If-Anweisungen mit jeweils einer Bedingung umbauen
Delphi-Quellcode:
ist schließlich das gleiche wie
if a and b then
Delphi-Quellcode:
im übrigen sollte es so aussehen:
if a then
if b then
Delphi-Quellcode:
und nicht das then auf die nächste Zeile vor das Break
if (FField[KingPos.X,KingPos.Y].Name='K') and
(FField[KingPos.X,KingPos.Y].White=UserWhite) then break; |
Re: Compiler will mich vera*** ??
Zitat:
-> Zitat:
Zitat:
|
Re: Compiler will mich vera*** ??
"break" verläßt in Deinem Fall, die innere Deiner schleifen, nicht aber die äußere.
Versuch doch mal nach dem Break ein ShowMessage oder was anderes hinzuschreiben und schau ob dieses ausgeführt wird oder aber übersprungen wird (per Einzelschritt-Debuggen). |
Re: Compiler will mich vera*** ??
Zitat:
|
Re: Compiler will mich vera*** ??
Zitat:
|
Re: Compiler will mich vera*** ??
Du könntest mit Exit aus der ganzen Procezur aussteigen, sehr schön ist diese Lösung aber nicht unbedingt.
|
Re: Compiler will mich vera*** ??
Delphi-Quellcode:
if ((FField[KingPos.X,KingPos.Y].Name='K') and (FField[KingPos.X,KingPos.Y].White=UserWhite)) then //das hier müsste er erkennen
break; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:31 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-2025 by Thomas Breitkreuz