Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Warum ist ein Boolean so groß? (https://www.delphipraxis.net/55716-warum-ist-ein-boolean-so-gross.html)

himitsu 26. Okt 2005 05:30

Re: Warum ist ein Boolean so groß?
 
Ach, daher haben die C-Header, worauf Delphi ja anscheinend aufgebaut ist, Integer/Cardinal, obwohl das Win32-SDK was von BOOL(LongBool) sagt.
Und ich dachte schon die haben sich verlesen -.-''

alzaimar 26. Okt 2005 07:00

Re: Warum ist ein Boolean so groß?
 
@himitsu: Das ist ja blasphemisch, was Du mit den Booleans anstellst (inc/dec) :zwinker: Das funktioniert? Cool, ehrlich. Aber ich würde das nicht in meinen Code schreiben, weil es durchaus mal sein kann, das Borland das nicht mehr unterstützt. Und dann suchst Du dir einen Wolf.

Robert Marquardt 26. Okt 2005 07:15

Re: Warum ist ein Boolean so groß?
 
Ein Boolean ist ein ordinaler Datentyp mit Succ(False) = True und Pred(True) = False sowie Ord(False) = 0 und Ord(True) = 1. Das ist Pascal.
Inc() und Dec() auf einem Boolean sind wirklich ein wenig dubios. Auf einem ByteBool, WordBool oder LongBool hingegen nicht, da dies Zahlentypen sind.

Muetze1 26. Okt 2005 07:28

Re: Warum ist ein Boolean so groß?
 
Zitat:

Zitat von Robert Marquardt
Ein Boolean ist ein ordinaler Datentyp mit Succ(False) = True und Pred(True) = False sowie Ord(False) = 0 und Ord(True) = 1. Das ist Pascal.
Inc() und Dec() auf einem Boolean sind wirklich ein wenig dubios. Auf einem ByteBool, WordBool oder LongBool hingegen nicht, da dies Zahlentypen sind.

Und genau deshalb ergibt Ord(Boolean(True)) immer 1, obwohl intern Borland auch hier mit -1 als Wert für True arbeitet.

Robert Marquardt 26. Okt 2005 09:09

Re: Warum ist ein Boolean so groß?
 
Zitat:

Zitat von Muetze1
Und genau deshalb ergibt Ord(Boolean(True)) immer 1

Das ist ein unsinniger Ausdruck. True ist bereits vom Typ Boolean. Eine Umtypung ist nicht noetig.

Mal genauer:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  B: Boolean;
  BB: ByteBool;
  WB: WordBool;
  LB: LongBool;
begin
  B := True;
  BB := B;
  WB := B;
  LB := B;
  ShowMessageFmt('%d %d %d %d', [Ord(B), Ord(BB), Ord(WB), Ord(LB)]);
end;
Das ergibt "1 -1 -1 -1".
Damit ist klar das ByteBool, WordBool und LongBool vorzeichenbehaftet sind (trotz ihres Namens).
Bei der Zuweisung von B wird eine Signextension vorgenommen, obwohl Boolean formal vorzeichenlos ist.
Intern wird fuer Boolean True auch definitiv 1 genommen. Aendert man naemlich Ord(B) im oben gezeigten Beispiel in Byte(B),
so wird immer noch "1" ausgegeben.
Der Grund fuer -1 als True in ByteBool etc ist Visual Basic das mit 0 und -1 in einem Long operiert.

himitsu 26. Okt 2005 12:53

Re: Warum ist ein Boolean so groß?
 
Zitat:

Zitat von alzaimar
@himitsu: Das ist ja blasphemisch, was Du mit den Booleans anstellst (inc/dec) :zwinker: Das funktioniert? Cool, ehrlich. Aber ich würde das nicht in meinen Code schreiben, weil es durchaus mal sein kann, das Borland das nicht mehr unterstützt. Und dann suchst Du dir einen Wolf.

Also da brauchst du/ihr wohl keine Bedenken haben ... kennt ihr z.B. die Klasse TCanvas?, dort wird inern sowas gemacht (um das Canvas zu sperren), wenn ich mich nicht irre (hab hier kein Delphi und daheim ist's im Moment auch nicht installiert, also kann ich da nicht nochmal nachsehen, aber ich glaub das mal gesehn zu haben ^^)

Also zumindestens bei ByteBool/WordBool/LongBool, bei Boolean scheint es zwar anders zu sein, aber da es sich dort auch um ein Byte handelt (was sih wohl auch nicht ändern wird), sollte es dort auch so bleiben ... jedenfalls wird ja immer (wenn ordentlich programmiert wurde) auf =0 und <>0 geprüft.

Muetze1 26. Okt 2005 13:02

Re: Warum ist ein Boolean so groß?
 
Zitat:

Zitat von Robert Marquardt
Zitat:

Zitat von Muetze1
Und genau deshalb ergibt Ord(Boolean(True)) immer 1

Das ist ein unsinniger Ausdruck. True ist bereits vom Typ Boolean. Eine Umtypung ist nicht noetig.

Das war kein Quellcode, dann hätte ich ihn entsprechend gekennzeichnet - das war Pseudocode. Ich wollte mit dem Boolean() den Typ nochmal explizit hervorheben auf den ich mich mit meiner Aussage beziehe.

Und bei dem Byte() Typecast wird afaik auch trotzdem die Umwandlung wie bei Ord() genommen intern. Ich glaube das Borland das intern so gebastelt hatte (Compiler Magic).

Khabarakh 26. Okt 2005 13:08

Re: Warum ist ein Boolean so groß?
 
Zitat:

Zitat von himitsu
Also da brauchst du/ihr wohl keine Bedenken haben ... kennt ihr z.B. die Klasse TCanvas?, dort wird inern sowas gemacht (um das Canvas zu sperren), wenn ich mich nicht irre (hab hier kein Delphi und daheim ist's im Moment auch nicht installiert, also kann ich da nicht nochmal nachsehen, aber ich glaub das mal gesehn zu haben ^^)

Wenn du LockCount meinst: ist ein Integer :wink: .

Richtig lustig wird dann so etwas:
Delphi-Quellcode:
var
  b: Boolean;
begin
  b := Boolean(2);

  if b then
    Writeln('1');

  if b = true then
    Writeln('2');

  Readln;
end.
Ich denke, ihr könnte euch die Ausgabe vorstellen :mrgreen: .

Olli 26. Okt 2005 13:13

Re: Warum ist ein Boolean so groß?
 
Gegenfrage:
Warum ist das menschliche Gehirn zu einem hohen Prozentsatz ungenutzt?


Ist doch redundant. Laßt es uns rausschnippeln. Also sorry, ich verstehe nicht wo das Problem ist, zumal schon die erste Antwort völlig korrekt war (Tubos). Auch der spätere Einwand, daß je nach Adressierungsmodus des Prozessors auch 32bit oder neuerdings 64bit schneller sein können war völlig korrekt (Oxmyx).

SMO 26. Okt 2005 17:20

Re: Warum ist ein Boolean so groß?
 
Zitat:

Zitat von Olli
Gegenfrage:
Warum ist das menschliche Gehirn zu einem hohen Prozentsatz ungenutzt?
Ist doch redundant. Laßt es uns rausschnippeln.

Meinst du das ernst? Ich hoffe nicht (sorry, mein Ironiedetektor ist gerade defekt :)). Das ist ein doofer alter Mythos. Wir benutzen 100% unseres Gehirns, wenn auch nicht gleichzeitig (CPUs sind ja auch nicht immer zu 100% benutzt/ausgelastet ;)). Siehe z.B. hier (Deutsch) oder hier (Englisch).

Zitat:

Also sorry, ich verstehe nicht wo das Problem ist, zumal schon die erste Antwort völlig korrekt war (Tubos). Auch der spätere Einwand, daß je nach Adressierungsmodus des Prozessors auch 32bit oder neuerdings 64bit schneller sein können war völlig korrekt (Oxmyx).
Ich glaube nicht, dass es hier ein "Problem" gibt, ich finde diese Diskussion interessant. Oxmyx' Aussage über die Ausrichtung war inkorrekt, was mich dazu angestoßen hat hier teilzunehmen. Ebenso wie mich deine kühne Aussage dazu verleitet hat, nochmal zu antworten. ;)


@Khabarakh:
Das ist wirklich lustig! Interessanterweise funktioniert dieser "Trick" (Fehler?) nicht mehr bei Byte/Word/LongBool. Der Compiler übersetzt dort "b := ByteBool(2)" direkt zu "b := -1". Aber selbst wenn man b anders auf den Wert 2 zwingt (z.B. "Byte(b) := 2") prüft "b = true" nicht etwa auf =1 oder =-1 sondern korrekt auf <>0.
Zusammengefasst also: Mit Boolean wird nur 1 ausgegeben, mit den anderen Bool-Typen 1 und 2.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr.
Seite 2 von 3     12 3      

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