Autor Beitrag
cuejo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 142

Win XP
Delphi 7 Personal und 2005 PE
BeitragVerfasst: Mi 11.10.06 11:12 
Hallo alle Miteinander
Ich habe mal eine ganz simple Frage. Warum gibt die Funktion BoolToStr() (D7) bei true den string-Wert -1 zurück? Ist eigentlich nicht wichtig und wahrscheinlich sogar OT und es geht mir auch nicht um die Umwandlung an sich, die kann man sich ja eben mal schnell schreiben, aber mich interessiert das jetzt mal. Normalerweise würde man doch sagen das true=1 ist, zumindest würde das meine Vorstellungen von Standards entsprechen. Also ich finde das ganze relativ merkwürdig.
:nixweiss:

_________________
Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
Tigerandy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Mi 11.10.06 11:16 
Hallo,

true=-1 und false=0 - das war schon immer so... ;)

Gruß
Tiger
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 11.10.06 11:17 
Moin!

Lass dir mal 0 und -1 binär anzeigen, dann weißt du warum. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
cuejo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 142

Win XP
Delphi 7 Personal und 2005 PE
BeitragVerfasst: Mi 11.10.06 11:21 
1111111111111111111111111111111111111111111111111111111111111111 = true?

_________________
Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
cuejo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 142

Win XP
Delphi 7 Personal und 2005 PE
BeitragVerfasst: Mi 11.10.06 11:22 
Das war der Windows-Rechner. Wahrscheinlich eher 11111111=true?

_________________
Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
cuejo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 142

Win XP
Delphi 7 Personal und 2005 PE
BeitragVerfasst: Mi 11.10.06 11:32 
Wikipedia hat folgendes geschrieben:
Boolesche Variablen sind Elemente einer booleschen Algebra, die immer einen von zwei Werten annehmen. Dieses Wertepaar wird je nach Anwendung u. a. als „wahr/falsch“, „true/false“ oder „1/0“ bezeichnet.

In elektrischen Schaltungen lassen sich boolesche Variablen durch unterschiedliche elektrische Spannungsbereiche realisieren. Die konkreten Spannungsgrenzen variieren je nach verwendeter Technik (Transistor-Transistor-Logik oder Cmos). In EDV-Systemen wird ein einzelnes Bit (wahr = 1; falsch = 0) verwendet.

Also was soll das ganze?

_________________
Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 11.10.06 11:39 
Moin!

Ja doch... denk mal ein bischen nach... :roll: ;)

Da man üblicherweise nicht auf einzelne Bits im Speicher zugreift (das dauert nämlich länger!) muss man immer alle Bits der Speicherzelle für die Bool´sche Variable setzen oder löschen, sonst gibt es Probleme mit den logischen Operatioren, da die ja bitweise arbeiten.

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
cuejo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 142

Win XP
Delphi 7 Personal und 2005 PE
BeitragVerfasst: Mi 11.10.06 11:57 
Ok, danke, jetzt habe ich's verstanden. Trotzdem wäre IMHO die Delphi-Funktion BoolToStr() sinnvoller, wenn sie einen char zurückgeben würde, und zwar Standardkonform '0' und '1'. Aber egal. :D

_________________
Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
cuejo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 142

Win XP
Delphi 7 Personal und 2005 PE
BeitragVerfasst: Mi 11.10.06 11:59 
Hmm... dann müsste sie aber auch eher BoolToChr heißen! :lol:

_________________
Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 11.10.06 12:01 
Moin!

Das kann BoolToStr doch, kannst doch eigene Strings verwenden. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mi 11.10.06 12:31 
user profile iconNarses hat folgendes geschrieben:
Moin!

Das kann BoolToStr doch, kannst doch eigene Strings verwenden. ;)

cu
Narses


Hallo,

Bool und boolean ist ja auch streng genommen nicht das gleiche: boolean ist strenges Pascal und tatsächlich ein bit mit true oder false. Bool ist ein Typ aus dem Windows-API in der Standard-Wortlänge (war 16 bit bei WfW, heute 32 bit) und mit 0 = false und true in allen anderen Fällen.

In Delphi gibt es daher boolean, ByteBool, WordBool und LongBool, wobei aus speichertechnischen Gründen boolean auch ein ganzes Byte belegt (möglicherweise ist das bei packed array of boolean anders). Da die Umwandlung automatisch erfolgt, denkt normalerweise niemand über die verschiedenen Typen nach.

BoolToStr (true) = -1 ist daher ebenso korrekt wie 'true' oder 'wahr', ein BooleanToStr dagegen sollte das nicht liefern.

Gruss Reinhard
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Mi 11.10.06 12:38 
user profile iconNarses hat folgendes geschrieben:
Da man üblicherweise nicht auf einzelne Bits im Speicher zugreift (das dauert nämlich länger!) muss man immer alle Bits der Speicherzelle für die Bool´sche Variable setzen oder löschen, sonst gibt es Probleme mit den logischen Operatioren, da die ja bitweise arbeiten.
Logische Operatoren arbeiten, im Gegensatz zu den bitweisen Operatoren (die in Pascal leider genauso heißen), ausdrucksbasiert und nicht bit-basiert.

Ob true nun -1, 1, 4927174 oder 42 ist, ist auf IA vollkommen uninteressant, denn es gibt keine Jumpbedingung "Ist 1" oder "Ist -1", sondern nur "Ist 0" und "Ist nicht 0" (JZ und JNZ). Daß true -1 ist, ist eine Eigenart von Delphi und ist in vielen anderen Sprachen nicht so. In C und C++ hat true den Wert 1. Es gibt nichtmal einen Standard für das ganze, theoretisch kann eine Architektur existieren, die als Jump-Bedingung tatsächlich "Ist 42" und "Ist nicht 42" abfragen kann, dort hätten false und true entsprechend andere Werte. Das ist auch der Grund, warum man normalerweise nicht in Bedingungen schreiben etwas wie if Something = true then schreiben soll. Das klappt mit false, weil false nahezu immer 0 ist, aber true ist definiert als "Ungleich false", also wäre 42 ein gültiges true. Eine Abfrage "if 42 = -1 then" würde natürlich nicht das gewünschte Ergebnis erzielen, eine Abfrage "if 42 then" hingegen schon, denn in Maschinensprache würde daraus ein JNZ offset werden, und 42 ist != 0. Diese ganze if variable = true then-Debatte ist normalerweise nicht notwendig, wenn man bei Delphi bleibt, denn einer Variable, der einmal true zugewiesen wurde, wird immer in einem Vergleich mit true auf eine erfüllte Bedingung ausgewertet werden. Zu Problemen führt das aber, wenn man Werte nimmt, die aus Bibliotheken kommen, die in einer anderen Sprache geschrieben wurden. Wenn die Win32-API einen boolschen Wert zurückgibt, wird das immer 0 und ungleich 0 sein, es ist nichtmal garantiert, daß ein wahres Funktionsergebnis immer 1 ist, denn oft sind in das Ergebnis noch zusätzliche Fehlercodes einkodiert, die mal eine dokumentierte Bedeutung haben und mal nur aus Kompatibilitätsgründen existieren und eigentlich nicht mehr verwendet werden sollten.
Rein elektrisch wird true und false im Prozessor übrigens durch "Spannung aus" und "Spannung an" in einem einzelnen Bit repräsentiert. Die meisten Arithmetikfunktionen setzen das Status-Register, das für diesen Zweck ein einzelnes Bit vorsieht, das Zero-Flag. Es hat den Wert 1, wenn der ausgewertete Wert 0 ist und den Wert 1, wenn der ausgewertete Wert nicht 0 ist. Es verhält sich also genau umgekehrt zu dem, was hier bisher gesagt wurde und auch umgekehrt zu den meisten gängigen Programmiersprachen.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
cuejo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 142

Win XP
Delphi 7 Personal und 2005 PE
BeitragVerfasst: Mi 11.10.06 13:13 
Danke. Ihr seid die Geilsten! :mrgreen: Mit so einer Resonanz auf die Frage hätte ich nie gegrechnet. Jetzt weiß ich eindeutig mehr. Ich ziehe aus dem Ganzen das Fazit, dass die Macher von Delphi das komische Hobby haben den Anwender absichtlich zu verwirren. :lol: Wenn die schon die verschiedenen Boolean-Typen intern verwalten, so dass der User davon nichts mitbekommt (oder nichts davon weiß weil er von Boolean-Typen generell nichts weiß), dann hätten die den Rückgabewert von BoolToStr() auch nicht nach deren internen Verfahren benennen sollen. Woher soll ein Neuling das denn wissen? :?

_________________
Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Mi 11.10.06 13:53 
user profile iconcuejo hat folgendes geschrieben:
Ich ziehe aus dem Ganzen das Fazit, dass die Macher von Delphi das komische Hobby haben den Anwender absichtlich zu verwirren.
Andere sind der Meinung, daß Delphi-Entwickler und die Entwickler von Delphi masoschistisch veranlagt sein müssen, sonst hätten sie sich nicht freiwillig für diese Sprache entschieden, aber das ist eine andere Geschichte.

Zitat:
Wenn die schon die verschiedenen Boolean-Typen intern verwalten, so dass der User davon nichts mitbekommt (oder nichts davon weiß weil er von Boolean-Typen generell nichts weiß)
Es ist der Sinn einer höhere Programmiersprache, die darunterliegende Architektur zu verstecken und eine möglichst generische Möglichkeit zur Verfügung zu stellen, Algorithmen zu implementieren. Ob ein boolscher Wert nun für wahr durch -1, 1 oder 42 repräsentiert wird, soll den Entwickler nicht interessieren. Darin liegt der Grund für die plattformunabhängigkeit vieler standardisierte Sprachen, sofern der Programmierer nicht von Annahmen über eine bestimmte Implementierung ausgeht.

Zitat:
dann hätten die den Rückgabewert von BoolToStr() auch nicht nach deren internen Verfahren benennen sollen. Woher soll ein Neuling das denn wissen? :?
Zur Ausgabe für den Endanwender ist das tatsächlich nichts. Eine lokalisierte Ausgabe der Worte "true" und "false" wäre sinnvoller gewesen, um Ergebnisse von BoolToStr() auch an einen Anwender zurückzugeben, der kein Programmierer ist.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Ydobon
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 42



BeitragVerfasst: Mi 11.10.06 17:07 
Hat deswegen BoolToStr nicht 2 mögliche Parameter? BoolToStr(true, true) ergibt auch den String 'True'.
cuejo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 142

Win XP
Delphi 7 Personal und 2005 PE
BeitragVerfasst: Mi 11.10.06 19:45 
Jepp, das war mir schon klar. Es war mir auch klar, dass man die Rückgabewerte anpassen kann. Das war ja auch gar nicht meine Frage. Ich wollte nur wissen, warum die Delphi-Macher die Funktion überhaupt mit diesen Rückgabewerten belegt hat.

_________________
Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.