| Autor |
Beitrag |
cuejo
      
Beiträge: 142
Win XP
Delphi 7 Personal und 2005 PE
|
Verfasst: 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.

_________________ Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
|
|
Tigerandy
      
Beiträge: 21
|
Verfasst: Mi 11.10.06 11:16
Hallo,
true=-1 und false=0 - das war schon immer so...
Gruß
Tiger
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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 
      
Beiträge: 142
Win XP
Delphi 7 Personal und 2005 PE
|
Verfasst: Mi 11.10.06 11:21
1111111111111111111111111111111111111111111111111111111111111111 = true?
_________________ Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
|
|
cuejo 
      
Beiträge: 142
Win XP
Delphi 7 Personal und 2005 PE
|
Verfasst: 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 
      
Beiträge: 142
Win XP
Delphi 7 Personal und 2005 PE
|
Verfasst: 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
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 11.10.06 11:39
Moin!
Ja doch... denk mal ein bischen nach...
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 
      
Beiträge: 142
Win XP
Delphi 7 Personal und 2005 PE
|
Verfasst: 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. 
_________________ Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
|
|
cuejo 
      
Beiträge: 142
Win XP
Delphi 7 Personal und 2005 PE
|
Verfasst: Mi 11.10.06 11:59
Hmm... dann müsste sie aber auch eher BoolToChr heißen! 
_________________ Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Mi 11.10.06 12:31
Narses 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
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Mi 11.10.06 12:38
Narses 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 
      
Beiträge: 142
Win XP
Delphi 7 Personal und 2005 PE
|
Verfasst: Mi 11.10.06 13:13
Danke. Ihr seid die Geilsten!  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.  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
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Mi 11.10.06 13:53
cuejo 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
      
Beiträge: 42
|
Verfasst: Mi 11.10.06 17:07
Hat deswegen BoolToStr nicht 2 mögliche Parameter? BoolToStr(true, true) ergibt auch den String 'True'.
|
|
cuejo 
      
Beiträge: 142
Win XP
Delphi 7 Personal und 2005 PE
|
Verfasst: 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.
|
|