Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Problem bei simpler if Abfrage


ScaVo - Mo 11.04.11 21:05
Titel: Problem bei simpler if Abfrage
Ich habe heute so fröhlich an meinem Rechner gesessen und zum Spaß ein wenig programmiert, als mir ein Fehler unterläuft den ich absolut nicht verstehe. Nach einigem gesuche habe ich folgenden Test in meinen Quelltext implementiert:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  if ARMP then begin
    sleep(1);
    if ARMP=true then begin
      sleep(1);
    end;
    if ARMP=false then begin
      sleep(1);
    end;
  end;

ARMP ist ganz nebenbei vom Typ boolean. Aber wie ist der Test im Debugmodus verlaufen? Nun, die Abfrage "if ARMP then" hat er bestätigt und den Block danach ausgeführt. Das Debugfenster zeigte mir an, dass ARMP den Wert true hat. Die Abfrage "if ARMP=true" hat Delphi dann aber nicht mehr ausgeführt - das hat mich irgendwie verwundert. Aber dass er dann auch (obwohl irgendwo es auch zu erwarten war) die Abfrage "if ARMP=false" nicht ausführte habe ich mich dann doch entschlossen euch mal wieder zu schreiben.

Ist euch soetwas auch schon mal passiert?
Wie lässt sich das beheben?

MfG Scavo

P.S.: Noch anzumerken ist, dass ich weiß, dass heute kein 1. April ist - auch wenn das ganze irgendwie nach einem Scherz klingt...


Martok - Mo 11.04.11 21:10

NIEMALS NICHT BOOLEANS AUF TRUE VERGLEICHEN! :motz:

*wieder hinsetz*

*tief durchatme*

*auf user profile iconLuckie wart und schonmal einen Link mitliefer*: *klick* [http://www.delphi-treff.de/tutorials/objectpascal/programmierung-mit-boolean-werten/typische-anfaengerfehler/]


;)


ScaVo - Mo 11.04.11 21:15

Hmm... leuchtet mir irgendwie ein... Danke!


jaenicke - Mo 11.04.11 21:16

Hier habe ich mal ein kleines gut verständliches Beispiel gebastelt, wann ein solcher Vergleich schief geht:
http://www.delphi-forum.de/viewtopic.php?p=548760#548760
Und warum das auch vollkommen unlogisch ist:
http://www.delphi-forum.de/viewtopic.php?p=560637#560637


Gerd Kayser - Mo 11.04.11 21:26

Einen großen Fehler habt Ihr aber noch übersehen:
Der Anweisungsblock (Zeile zwei bis acht) wird nur ausgeführt, wenn ARMP true ist. In diesem Block kann daher eine Abfrage auf false (Zeile sechs) niemals funktionieren. Entweder ARMP ist true oder false. Beides zusammen geht nicht.