Fragen zu Boolean

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
Levario
Beiträge: 101
Registriert: Mo 1. Sep 2014, 14:32
OS, Lazarus, FPC: Windows 10 Pro Laptop (Lazarus 3.0.0 FPC 3.2.2)
CPU-Target: 64 Bit
Wohnort: Deutschland / NRW

Fragen zu Boolean

Beitrag von Levario »

Hallo zusammen,

wenn ich die Ergebnisse von Vergleichoperaten ansehe bekomme ich als Wahrheitswert eine -1 heraus.

Wenn EdtA.Text = 5
und EdtB.Text = 10
Ist das EdtErgebnis1.Text = -1

Code: Alles auswählen

EdtErgebnis1.Text := BoolToStr(StrToInt(EdtA.Text) < StrToInt(EdtB.Text));
Ich hätte da nun eine 1 anstelle eine -1 erwartet. Woran liegt das?
Der Weg ist das Ziel... Aber bitte nicht vergessen los zu laufen :).

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Fragen zu Boolean

Beitrag von theo »

Das ist oft so, dass 0 False bedeutet und alles andere True (Auch in C).
Da braucht auch das Beispiel nicht so kompliziert sein.
Wenn du es so machst, bekommt du 'true'/'false' zurück.

Code: Alles auswählen

Caption:=BoolToStr(true,true);  

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Fragen zu Boolean

Beitrag von marcov »

Aber das ist nicht so in Pascal.

In Pascal ist 0=FALSE 1=TRUE und alles anderes ist nicht definiert.

BoolToStr ist aber teilweise auch für COM Verwaltung hinein gefügt (Damals in D6 Zeiten mit MSXML), und hat dadurch Standard COM kompatibles Verhalten.

Tipp: vergleiche mit inttostr(ord(b))

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Fragen zu Boolean

Beitrag von siro »

Grade mal einiges rumprobiert:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var b:Boolean;
begin
  b:=FALSE;                              // b ist 0 = FALSE

  inc(b);                                // b ist nun 1 = TRUE
  if b=TRUE then caption:='TRUE'
            else caption:='FALSE';

  inc(b);                                // b ist nun 2 und bleibt TRUE
  if b=TRUE then caption:='TRUE'
            else caption:='FALSE';

  caption:=BoolToStr(b);                 // b ist 2 !!! Ausgabe -1
  caption:=IntToStr(ord(b));             // b ist 2 !!! Ausgabe 2

  // neue initialisierung:
  b:=FALSE;                              // b ist 0 = FALSE
  dec(b);                                // b ist nun 255 
  caption:=IntToStr(ord(b));             // !!! Ausgabe 255
  caption:=BoolToStr(b);                 // !!! Ausgabe wieder -1

  if b=TRUE then caption:='TRUE'         // b ist 255 Ausgabe ist TRUE
            else caption:='FALSE';
end;             
0 = FALSE
ungleich 0 = TRUE

warum es noch das Longbool gibt habe ich ehrlich gesagt nicht verstanden....ausser dass es nicht ein Byte sondern 4 Bytes benötigt....
Wozu braucht man das ?
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Benutzeravatar
Levario
Beiträge: 101
Registriert: Mo 1. Sep 2014, 14:32
OS, Lazarus, FPC: Windows 10 Pro Laptop (Lazarus 3.0.0 FPC 3.2.2)
CPU-Target: 64 Bit
Wohnort: Deutschland / NRW

Re: Fragen zu Boolean

Beitrag von Levario »

ersteinmal vielen lieben Dank für eure Antworten das hat mich um einiges schlauer gemacht. Ich habe gerade einen JavaScript Kurs auf Udemy gemacht und der Seminarleiter hatte auf diese Art und Weise eine UND und ODER Verknüfung als Tabelle ausgegeben. Wollte es in Lazarus nachstellen, allerdings ohne das richtige Ergebnis bekommen zu haben. Daher meine Frage.
marcov hat geschrieben:
So 18. Sep 2022, 22:28
Tipp: vergleiche mit inttostr(ord(b))
Welchen Vorteil hat es alles in Byte umzuwandeln, dass erschließt sich mir aktuell nicht.
Der Weg ist das Ziel... Aber bitte nicht vergessen los zu laufen :).

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Fragen zu Boolean

Beitrag von theo »

Bei BoolToStr gibt es ja Parameter, um zu bestimmen, was dabei herauskommen soll.
Also kannst du es so machen, wenn du 0 und 1 haben willst:

Code: Alles auswählen

Caption:=BoolToStr(True, '1','0');     
In sysstrh.inc ist standardmässig explizit -1 gesetzt. Das kommt also nicht aus den "untiefen" des Compilers oder so.

Code: Alles auswählen

  If B then
    Result:='-1'     
Warum das so ist, weiss ich allerdings auch nicht.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Fragen zu Boolean

Beitrag von Warf »

Pascal hat zwei boolean typen, Boolean und die integer kompatiblen bools (longbool, bytebool, etc), und die verhalten sich unterschiedlich:

Code: Alles auswählen

  WriteLn(Ord(Boolean(True))); // 1
  WriteLn(Ord(LongBool(True))); // -1
  WriteLn(Ord(ByteBool(True))); // -1
Beides hat vor und Nachteile, mit True = 1 kann man ganz nett rechnen (z.B. if b then x := a else x := 0 ist equivalent zu x := ord(b) * a).
-1 hat den vorteil das bitweise und logische operatoren identisch sind (logisches not von False ist True, bitwises not von 0 ist -1).

Aber auch wen es mal nützlich sein kann, im endeffekt ist es einfach verwirrender als hilfreich
siro hat geschrieben:
Mo 19. Sep 2022, 01:55
warum es noch das Longbool gibt habe ich ehrlich gesagt nicht verstanden....ausser dass es nicht ein Byte sondern 4 Bytes benötigt....
Wozu braucht man das ?
Ist relativ nützlich, viele System APIs sind für C geschrieben, und dort gibt es kein Boolean typen, sondern es wird einfach int benutzt. Mal abgesehen von dem grauen das eigentlich C ints sind (da sie lediglich als mindestens 15 bit stellen definiert sind, also in praxis 16, 32 oder 64 bit groß sein können, und dann theoretisch auch noch 1er oder 2er complement oder sign und magnitude kodiert sein können), bedeutet das das wenn man mit den ergebnissen von C funktionen/APIs boolean rechnen möchte, ist es hilfreich die einfach in einen Longbool zu stecken statt immer ein <> 0 zu schreiben

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Fragen zu Boolean

Beitrag von siro »

Danke Dir warf, ja das leuchet mir ein mit den anderen Booltypen für die Kompatibilität,
je nach Controllertyp bzw. System sind die Datentypen in der Breite ja nicht genormt...

Ich habe grade mir mal folgendes angesehen:
ord(TRUE) ergibt 1

wenn man nun folgende Abfrage tätigt:
if b = TRUE then.....
müsste theoretisch der Code: if b = 1 erzeugt werden

gleiches im Prinzip auch hier:
if b then ........

Der Compiler scheint aber generell auf 0 abzufragen und verzweigt dann wenn nicht 0.
Damit ergibt sich automatisch dass alle Werte ungleich 0 als TRUE interpretiert werden.

Zumindest habe ich das auf dem PC im Assembblercode mir grade angesehen.

Damit spielt der Wert von TRUE ja keine Rolle mehr, Hauptsache er ist nich FALSE. :mrgreen:
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Fragen zu Boolean

Beitrag von theo »

siro hat geschrieben:
Mo 19. Sep 2022, 10:34
Der Compiler scheint aber generell auf 0 abzufragen und verzweigt dann wenn nicht 0.
Damit ergibt sich automatisch dass alle Werte ungleich 0 als TRUE interpretiert werden.
Sag ich doch... :wink:

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Fragen zu Boolean

Beitrag von Warf »

siro hat geschrieben:
Mo 19. Sep 2022, 10:34
Der Compiler scheint aber generell auf 0 abzufragen und verzweigt dann wenn nicht 0.
Damit ergibt sich automatisch dass alle Werte ungleich 0 als TRUE interpretiert werden.

Zumindest habe ich das auf dem PC im Assembblercode mir grade angesehen.

Damit spielt der Wert von TRUE ja keine Rolle mehr, Hauptsache er ist nich FALSE. :mrgreen:
Das hat übrigens einen sehr netten Seiteneffekt, undswar die nicht transitivität von =

Code: Alles auswählen

var
  b1, b2: Boolean;
begin
  b1 := True;
  b2 := Boolean(42);
  if b1 = True then
    WriteLn('b1 = True');
  if b2 = True then
    WriteLn('b2 = True');
  if b1 <> b2 then
    WriteLn('b1 <> b2');
Ausgabe:
b1 = True
b2 = True
b1 <> b2

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Fragen zu Boolean

Beitrag von siro »

Okay, die sind also nicht GANZ gleich, sondern nur so UNGEFÄHR gleich TRUE... :shock: b1 ist ein bischen weniger TRUE :lol:

Code: Alles auswählen

  if b1 < b2 then
    Write('b1 ist weniger TRUE als b2, ');
  if b1 > FALSE then
    WriteLn('aber groesser als FALSE'); 
das geht sogar...
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Fragen zu Boolean

Beitrag von Warf »

Und wenn man schon dabei ist relationen zu zerschießen, stellt sich heraus das ein wert gleichzeitig der selbe wert als auch größer als dieser Wert sein kann

Code: Alles auswählen

  b := Boolean(42);
  if (b = True) and (b > True) then
    WriteLn('b = True and b > True'); // Wird ausgegeben

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Fragen zu Boolean

Beitrag von m.fuchs »

Die nicht themen-relevanten Beiträge wurden verschoben.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten