Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Selsames verhalten bei True abfrage (https://www.delphipraxis.net/90160-selsames-verhalten-bei-true-abfrage.html)

EWeiss 12. Apr 2007 19:01

Re: Selsames verhalten bei True abfrage
 
Zitat:

Zitat von Christian Seehase
Moin Emil,

Zitat:

Zitat von EWeiss
Wenn ich aus VB '-1 oder 0' für boolean sende kann in Delphi niemals der wert '1 = true' eintreten

und deshalb prüft man nie auf = true ;-)

Um Boolsche-Variablen sprechend initialisieren zu können muss man sich für einen Wert entscheiden, der für true steht, in Delphi ist das dann halt 1, in VB -1.

Ja danke.. ;)
habs jetzt so geändert das es Sprachunabhängig ist..

gruss Emil

Amateurprofi 12. Apr 2007 20:26

Re: Selsames verhalten bei True abfrage
 
Zitat:

Zitat von SirThornberry
Zudem hat die cpu mehr zu tun wenn du auf True vergleichst anstelle nur den Boolean als Bedingung zu nehmen (weil ja sonst erst geprüft werden muss ob 2 Variablen identich sind und dann ob der vergleich wahr ist)

@SirThornberry

Das ist so nicht ganz richtig.

ein "if a=true then " wird umgesetzt in
Delphi-Quellcode:
cmp a,1
jnz xxxx // wenn a nicht true ist
ein "if a then" wird umgesetzt in
Delphi-Quellcode:
cmp a,0
jz xxx // wenn a = 0 also false ist
ob die CPU gegen 0 oder 1 prüft macht (vom Aufwand her) keinen Unterschied.

Ansonsten hast Du natürlich Recht mit der Aussage "nie mit True vergleichen.."

himitsu 13. Apr 2007 07:10

Re: Selsames verhalten bei True abfrage
 
Auf True sollte man halt nie prüfen, es sei denn man will/muß ganz genau wissen, ob es wirklich mit True identisch ist.

also im Normalfall immer nur:
B
not B


oder maximal noch,
B <> False
da False immer nur 0 ist.
(wobei es eigentlich besser wäre gleich auf alle "=/<> true/false" zu verzichten)


Und nochmals: nein, kein Bug ... schließlich will man manchmal auch genau dieses Verhalten (B = True, also True <> True) haben.

Muehle 13. Apr 2007 08:12

Re: Selsames verhalten bei True abfrage
 
Zu

AppOwnHdcW2 = True (*)


Also mal grundsätzlich falls AppOwnHdcW2 boolean ist, dann
dürfte es eigentlich kein Problem geben !!!

Ist jedoch AppOwnHdcW2 ein Handle, so wie es aussieht,
so hat sich eingebürgert :

if AppOwnHdcW2 then

Grund :

Handle = nil -> Bedingung wird als false interpretiert,
ansonsten true.

Es gilt also folgende Regel :

Vergl. mit true/false nur bei boolean

ansonsten je nach Programmiersprache erstmal schauen,
wie:

if wert then

interpretiert wird.

mkinzler 13. Apr 2007 08:15

Re: Selsames verhalten bei True abfrage
 
Zitat:

Vergl. mit true/false nur bei boolean
Nein bei Boolean entfällt der Vergleich:
Delphi-Quellcode:
if b
oder
Delphi-Quellcode:
if not b
und auf nicht if b = true

Muetze1 13. Apr 2007 08:59

Re: Selsames verhalten bei True abfrage
 
Zitat:

Zitat von Muehle
Ist jedoch AppOwnHdcW2 ein Handle, so wie es aussieht, so hat sich eingebürgert :

Code:
if AppOwnHdcW2 then
Grund :

Handle = nil -> Bedingung wird als false interpretiert,
ansonsten true.

Nein! Wenn du selber sagst, dass es ein Handle ist, dann ist es kein boolscher Ausdruck und das wird dir der Compiler um die Ohren hauen. Das hat sich vielleicht bei C/C++ eingebürgert, aber nicht bei Delphi, da Delphi nicht standardmässig Ordinaltypen (ausser Boolean) auf Ungleichheit mit 0 prüft!

Bei Boolean gilt auch grundsätzlich der Hinweis von mkinzler...

Muehle 13. Apr 2007 10:42

Re: Selsames verhalten bei True abfrage
 
zu mkinzler :

natürlich hast du da recht, da kürzer.

jedoch ist if (a=false) zumindest nicht falsch, falls a boolean ist.

Gruß G.M.

himitsu 13. Apr 2007 10:53

Re: Selsames verhalten bei True abfrage
 
hab's dochauch schon gesagt ... mit/auf FALSE könnte man prüfen, aber da es mit TRUE nicht geht, ist es besser dieses gleich ganz sein zu lassen.

Viele machen ja schließlich nur das nach, was sie irgendwo sehn und denken sich womöglich mit FALSE arbeiten ja viele, warum soll ich's dann nicht auch mit TRUE versuchen ... und irgendwann landen die dann wieder hier und wundern sich weil irgendwas nicht geht.

jbg 13. Apr 2007 12:04

Re: Selsames verhalten bei True abfrage
 
Zitat:

Zitat von EWeiss
Ich denke das ist ein bug in Delphi.
Wenn ich einen Wert strikt als boolean definiere erwarte ich auch das nur auf true
oder false geprüft wird und nicht auf integer oder byte werte.

Nein es ist ein Bug in deiner Deklaration. Wenn du von VB eine Boolschen Wert bekommen willst oder reinreichst, musst du den Datentyp LongBool/WordBool/ByteBool statt Boolean verwenden. Delphi macht dann ganz automatisch die Übersetzung von -1 nach 1 bzw. andersherum.

Delphi-Quellcode:
var
  lb: LongBool;
  b: Boolean;
begin
  lb := True;
{ 83C8FF          or eax,-$01  }
  b := lb;
{ 83F801           cmp eax,$01
  1BC0             sbb eax,eax
  40               inc eax     }
  if b = True then
{ 3C01             cmp al,$01
  7505             jnz +$05     }
    ShowMessage('Ist True');
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr.
Seite 2 von 2     12   

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