Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Unerwartetes Verhalten

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
tom_dehn



Anmeldungsdatum: 05.10.2015
Beiträge: 23

BeitragVerfasst am: 20.03.2017, 11:14    Titel: Unerwartetes Verhalten Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9710
Wohnort: Neben der Festplatte

BeitragVerfasst am: 20.03.2017, 11:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5876
Wohnort: Deutschland

BeitragVerfasst am: 20.03.2017, 20:26    Titel: Antworten mit Zitat

Jojo hat Folgendes geschrieben:
Das Bitweise NOT aus FreeBASIC entspricht in C dem Operator "^".

Nicht "~"?
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9710
Wohnort: Neben der Festplatte

BeitragVerfasst am: 20.03.2017, 23:35    Titel: Antworten mit Zitat

Äh, natürlich, ^ wäre XOR. Ist korrigiert. zwinkern
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
tom_dehn



Anmeldungsdatum: 05.10.2015
Beiträge: 23

BeitragVerfasst am: 21.03.2017, 08:54    Titel: Antworten mit Zitat

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... zwinkern

Vielen Dank

Tom
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9710
Wohnort: Neben der Festplatte

BeitragVerfasst am: 21.03.2017, 11:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz