Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
blackwatcher
Anmeldungsdatum: 05.10.2017 Beiträge: 2
|
Verfasst am: 05.10.2017, 18:49 Titel: If 0 THEN? |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4601 Wohnort: ~/
|
Verfasst am: 05.10.2017, 20:38 Titel: |
|
|
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, 20:39, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 05.10.2017, 20:39 Titel: Optional anschaltbare Debug-Ausgabe |
|
|
Hallo und willkommen im Forum!
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. _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2509 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 06.10.2017, 21:56 Titel: |
|
|
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 |
|
|
Marc Bonus
Anmeldungsdatum: 19.11.2016 Beiträge: 43
|
Verfasst am: 07.10.2017, 04:43 Titel: |
|
|
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 |
|
|
blackwatcher
Anmeldungsdatum: 05.10.2017 Beiträge: 2
|
Verfasst am: 07.10.2017, 09:00 Titel: |
|
|
Dankeschön! |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 07.10.2017, 14:28 Titel: |
|
|
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 |
|
|
Marc Bonus
Anmeldungsdatum: 19.11.2016 Beiträge: 43
|
Verfasst am: 07.10.2017, 15:35 Titel: |
|
|
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. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2509 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 07.10.2017, 16:29 Titel: |
|
|
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 |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1213 Wohnort: Ruhrpott
|
Verfasst am: 07.10.2017, 16:34 Titel: |
|
|
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.
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4601 Wohnort: ~/
|
Verfasst am: 07.10.2017, 18:47 Titel: |
|
|
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 |
|
|
|