|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
tom_dehn
Anmeldungsdatum: 05.10.2015 Beiträge: 30
|
Verfasst am: 20.03.2017, 11:14 Titel: Unerwartetes Verhalten |
|
|
Guten Tag.
Kein Problem, aber merkwürdig (siehe Code).
Keine Beschwerde meinerseits, aber: Ich kann´s mir nicht erklären.
Wer kann´s ?
Code: |
' "Postfaktisches" BOOLean
' FB 1.05/Win64
Dim choice As String
choice=""
Print "OK:"
While Len(choice)=0:choice=InKey():Wend
Print "LastKey: " & Asc(choice)
While Len( inkey() ):Wend
Print "Passed 1"
choice=""
print "NOT_OK:"
Print "Choice State/Len:"; Not Len(choice);" ";Len(choice)
' "Not Len(choice)" == -1, so:
' not FALSE should be TRUE
' but: following WHILE:WEND never comes back
While (Not Len(choice)):choice=InKey():Wend
Print "LastKey: " & Asc(choice)
Print "Passed 2"
|
Merci!
Tom |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 20.03.2017, 11:55 Titel: |
|
|
Zitat: | ' "Not Len(choice)" == -1, so:
' not FALSE should be TRUE
|
Das ist nur die halbe Wahrheit, und NOT wird in FreeBASIC gerne missverstanden / missbraucht.
NOT ist die bitweise boolesche Negation. Die Negation wird also auf jedes einzelne Bit deiner Variable angewendet. Nehmen wir also an, der Benutzer hat eine Eingabe getätigt, sprich LEN(choice) = 1.
Wie sieht eine 1 als Bitmuster aus? Ziemlich simpel, 00000000000000000000000000000001 (unter der Annahme, dass LEN ein 32-Bit-Integer zurückgibt). Wie sieht NOT 1 aus? 11111111111111111111111111111110! Damit sollte klar sein, warum die Schleife niemals endet: NOT 1 = -2. Sie könnte nur enden, wenn LEN -1 zurückgibt (alle Bits gesetzt => NOT -1 hat gar keine Bits gesetzt = 0), was praktisch unmöglich ist.
Sinnvoller ist es deswegen auf "LEN(choice) = 0" bzw "LEN(choice) > 0" zu prüfen.
Kleine Ergänzung: in C-ähnlichen Sprachen ist "!" tatsächlich die logische Negation, dort würde dein Code so funktionieren. Deswegen wäre es z.B. in C++ kein Problem (und durchaus üblich) so etwas wie "while(!choice.length())" zu schreiben. Das Bitweise NOT aus FreeBASIC entspricht in C dem Operator "~". _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Zuletzt bearbeitet von Jojo am 20.03.2017, 23:35, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 20.03.2017, 23:35 Titel: |
|
|
Äh, natürlich, ^ wäre XOR. Ist korrigiert. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
tom_dehn
Anmeldungsdatum: 05.10.2015 Beiträge: 30
|
Verfasst am: 21.03.2017, 08:54 Titel: |
|
|
Hi Jojo,
Jojo hat Folgendes geschrieben: | NOT ist die bitweise boolesche Negation
| Danke. Begriffen.
Jojo hat Folgendes geschrieben: | Sinnvoller ist es deswegen auf "LEN(choice) = 0" bzw "LEN(choice) > 0" zu prüfen.
| Hab ich auch gemerkt, siehe "OK:".
Gegenvorschlag (schreibfaul, und wegen der "Kosmetik"):
Code: | #Define isNil(_s1_) Cast(Boolean, (Len(_s1_)))
While IsNIL(Choice):choice=InKey():Wend |
Noch was:
Jojo hat Folgendes geschrieben: | Kleine Ergänzung: in C-ähnlichen Sprachen ist "!" tatsächlich die logische Negation, dort würde dein Code so funktionieren.
| Mein Fehler offenbar: Im "klassischen" BASIC, so weit ich mich an MBASIC (CP/M) erinnern kann, gab's das bitweise NOT gar nicht. Hab jetzt aber keine Lust, zur Überprüfung CP/M zu installieren. Aber Fakes sind ja gerade in Mode...
Vielen Dank
Tom |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 21.03.2017, 11:39 Titel: |
|
|
Hallo Tom, eigentlich sollte NOT in allen klassischen BASIC-Dialekten Bitweise sein (FreeBASIC hat sein NOT schließlich ja auch von QBasic geerbt). Aber es kann natürlich sein, dass es den einen oder anderen "Außenseiter" gibt, auch wenn es mich wundern würde. Da die meisten BASIC-Dialekte keinen Boolean-Datentyp haben, ist ein bitweises NOT auch die einzige sinnvolle Lösung in diesen Dialekten, ein logisches NOT wäre relativ nutzlos. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|