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:

If 0 THEN?

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



Anmeldungsdatum: 05.10.2017
Beiträge: 2

BeitragVerfasst am: 05.10.2017, 17:49    Titel: If 0 THEN? Antworten mit Zitat

Hallo,
Ich hoffe diese Frage wurde hier noch nicht zu oft beantwortet. Ich konnte dazu nichts finden obwohl es bestimmt ganz simpel ist.
Ich analysiere gerade ein altes Qbasic Programm und das hat sowas wie das hier öfters drinnenstehen:

SUB GesamtLaden
IF 0 THEN
CLS
PRINT BauteilNr%
halt
END IF

Was bedeutet IF 0 THEN? Was wird denn da geprüft ob es 0 ist?
Ich werde daraus nicht so richtig schlau...

Vielen lieben Dank schonmal im vorraus...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 05.10.2017, 19:38    Titel: Antworten mit Zitat

Jeder Vergleich liefert einen boolschen Wert zurück: Aussage ist wahr (-1) oder falsch (0). Etwas weiter gefasst wird jeder Wert <> 0 als wahr und nur der Wert 0 als falsch interpretiert.
IF 0 THEN ... prüft immer eine falsche Bedingung, d. h. der Code dazwischen wird nie ausgeführt. Früher hat man das öfter mal verwendet, um größere Code-Blöcke auszukommentieren (da gibt es heute bessere Möglichkeiten).
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.


Zuletzt bearbeitet von nemored am 05.10.2017, 19:39, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 05.10.2017, 19:39    Titel: Optional anschaltbare Debug-Ausgabe Antworten mit Zitat

Hallo und willkommen im Forum! lächeln

Ich vermute, das ist als optionale Debug-Ausgabe gedacht. So muss man nur 1 Zeichen Code ändern und der IF-Block wird entweder ausgeführt oder nicht ausgeführt. Man muss also nicht die enthaltenen Zeilen alle mit Kommentar vorher versehen oder Kommentarzeichen entfernen.

Viele Grüße!
Sebastian

//edit: Eijeijei, nemored war schneller. durchgeknallt
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 06.10.2017, 20:56    Titel: Antworten mit Zitat

QBasic (oder eigentlich alle älteren BASIC-Dialekte), aber auch C und C++ (ältere Versionen) besitzen noch kein Boolean als Datentyp und "missbrauchen" Integer dafür, wo der Wert 0 False entspricht, während alle Werte <>0 (meistens -1) True entsprechen.

FreeBasic besitzt gemäss

https://www.freebasic-portal.de/befehlsreferenz/boolean-649.html

inzwischen einen sauberen Boolean-Datentyp, wie gerade dieses Beispiel zeigt:
Code:
Dim a As boolean

Dim c As Integer

Dim x As Single

ScreenRes 640, 480, 4
Width 80, 30
c = 17

Input "Wert"; x

' Auch absolut korrekt und zulässig: Statt das Ergebnis vom Vergleich
' direkt einem IF "füttern" kann dieses auch in einer Variable gespeichert
' werden.
a = x < 3.0

' Ausgabe in Sinne eines toString ist auch möglich
Print "Wert von a: "; a

' Dies wehrt der Compiler richtigerweise ab!
' Print "Mix: "; a + c
' Alle älteren BASIC hätten so etwas noch zugelassen...

If a Then
   Print "x ist kleiner als 3."
Else
   Print !"x ist gr\148sser gleich 3."
EndIf

Sleep

_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Marc Bonus



Anmeldungsdatum: 19.11.2016
Beiträge: 43

BeitragVerfasst am: 07.10.2017, 03:43    Titel: Antworten mit Zitat

Musste ich auch gleich testen:

Code:
if true then ? "wahr"
if false then ? "falsch"
if 0 then ? "0"
if 1 then ? "1"
if -1 then ? "-1"
if 0.0 then ? "0.0"
if 0.1 then ? "0.1"
if -0.1 then ? "-0.1"


Ausgabe:

wahr
1
-1
0.1
-0.1
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
blackwatcher



Anmeldungsdatum: 05.10.2017
Beiträge: 2

BeitragVerfasst am: 07.10.2017, 08:00    Titel: Antworten mit Zitat

Dankeschön!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 07.10.2017, 13:28    Titel: Antworten mit Zitat

dreael hat Folgendes geschrieben:
aber auch C und C++ (ältere Versionen) besitzen noch kein Boolean als Datentyp

Nur mal so am Rande: Bei C++ gibt es bool seit über 24 Jahren (also quasi vernachlässigbar, dass es das nie gab), bei C gibt es seit C99 auch schon sehr lange den stdbool-Header.
_________________
» 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
Marc Bonus



Anmeldungsdatum: 19.11.2016
Beiträge: 43

BeitragVerfasst am: 07.10.2017, 14:35    Titel: Antworten mit Zitat

Dass man nach IF auch eine Variable einsetzen kann ist ja klar:

Code:
Dim as integer a
For a = -3 to 3
if a then ? a
next
?
Dim as single b
For b = -0.3 to 0.3 Step 0.1
if b then ? b
next
?
Dim as double c
For c = -0.3 to 0.3 Step 0.1
if c then ? c
next



Ausgabe:

Zitat:
-3
-2
-1
1
2
3

-0.3
-0.2
-0.1
-1.490116e-08
0.09999999
0.2
0.3

-0.3
-0.2
-0.09999999999999998
2.775557561562891e-17
0.1
0.2


Nanu?

Ich meine man braucht so etwas ja kaum jemals, aber eigenartig ist es. cool
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 07.10.2017, 15:29    Titel: Antworten mit Zitat

Marc Bonus hat Folgendes geschrieben:

-0.3
-0.2
-0.09999999999999998
2.775557561562891e-17
0.1
0.2

Nanu?

Ich meine man braucht so etwas ja kaum jemals, aber eigenartig ist es. 8)

Kurz & bündig: Aus Rückwärtskompatibilitätsgründen hat Dir der FB-Compiler auch einen numerischen Ausdruck anstelle eines Boolean im IF erlaubt. Bei den Fliesskommazahlen spielt noch die Rundungsungenauigkeit hinein, womit ein auch nur ganz geringfügig von Null abweichender Wert bereits als True gilt.

Boolean wird auch bei vielen Funktionen wie beispielsweise EOF() auch verwendet, wobei dies FreeBasic hier auch wieder eher rückwärtskompatibel handhabt:

Code:
' Tests mit Boolean

Dim a As Boolean

Dim y As String, z As String, handle As Integer

ScreenRes 640, 480, 4
Width 80, 30

Input "Name einer Textdatei"; y
handle = FreeFile
Open y For Input As handle
' Zuweisung klappt
a = Eof(handle)
Print a
' Aber hier kommt immer noch eine Zahl zurück! Boolean wäre sinnvoller...
Print Eof(handle)
While Not a
   Line Input #handle, z
   Print "Zeile: >"; z; "<"
   a = Eof(handle)
Wend
Close handle

Sleep


Das Beispiel zeigt: Semantisch kann man voll mit Boolean arbeiten, als wäre es als
Code:
Declare Function Eof(handle As Integer) As Boolean

definiert, FreeBasic aber aus Rückwärtskompatibilitätsgründen immer noch
Code:
Declare Function Eof(handle As Integer) As Integer

verwendet.

Bei eigenen Libraries würde ich sinnvollerweise empfehlen, in solchen Fällen nicht mehr die 0/-1-Integer-Semantik zu benützen, sondern konsequent Boolean verwenden, wie dies bei Pascal, Modula-2 usw. schon immer der Fall war.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 07.10.2017, 15:34    Titel: Antworten mit Zitat

Das ist nicht eigenartig, sondern logisch, wenn man weiß, warum es passiert. Wie du sicherllich weisst, rechnet der Prozessor intern mit Binärzahlen, deine Eingaben sind aber dezimal und müssen daher umgewandelt werden. Eine glatte Dezimalzahl ergibt aber nicht notwendigerweise auch eine glatte Binärzahl, und in diesem Fall werden die überschüssigen Stellen der Mantisse abgeschnitten, wodurch bei jeder Rechenoperation ein Rundungsfehler entsteht. Das ist übrigens eine klassische Anfängerfalle, in die ich seinerzeit auch getappt bin.

Im englischen Forum läuft gerade eine Diskussion, welche Fähigkeiten ein Anfänger erwerben sollte (Top 50), um ein guter Programmierer zu werden. Diese dezimal/binär - Geschichte muß unbedingt mit auf die Liste. lächeln

Gruß
grindstone

EDIT: Upps, da war dreael schneller.
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 07.10.2017, 17:47    Titel: Antworten mit Zitat

Zitat:
Bei eigenen Libraries würde ich sinnvollerweise empfehlen, in solchen Fällen nicht mehr die 0/-1-Integer-Semantik zu benützen, sondern konsequent Boolean verwenden

Ich habe gerade festgestellt, dass inzwischen auch der Vergleich zwischen Zahlen- und Boolwerten sauberer gelöst ist; früher habe ich noch eine Warnung bekommen, wenn ich so etwas versucht habe:
Code:
if (a < b) = false then print "..."

Jetzt ist offenbar nur der Vergleich (-1 = true) und (0 = false) akzeptiert.
Code:
print -1 = true   ' -1
print  0 = false  ' -1
print  1 = true   '  0
print  1 = false  '  0

_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. 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