Seite 1 von 2
Not() mal geht's mal kennt er es nicht...
Verfasst: 31.05.2007 16:26
von Kurzer
Hallo,
bin (mal wieder) etwas verwirrt.

Folgendes in einem jungfräulichen Fenster eingetippert geht:
Schreibe ich in meinem Programm aber:
wobei DisconnectFromDB() folgende Procedure ist:
Code: Alles auswählen
Procedure DisconnectFromDB()
If CloseDatabase(#Database) = 0
MessageRequester("Error", "Die Datenbankverbindung kann nicht geschlossen werden", #MB_ICONERROR|#MB_OK)
ProcedureReturn #False
Else
ProcedureReturn #True
EndIf
EndProcedure
...dann will der das Not() plötzlich nicht mehr kennen.
(ConnectState ist ein LONG)
Fehler bei mir oder bei PB?
Gruß Markus
PS: Was muß man übrigens tun, um in der Forums-Suche nach dem Wort 'Not' zu suchen?

Verfasst: 31.05.2007 16:58
von Kaeru Gaman
Not ist keine funktion..
das erste codebeispiel funzt nur, weil die klammern als rechnungsklammern interpretiert werden.
Debug Not(#True)
=
Debug Not (#True)
=
Debug Not #True
das geht auch nicht:
das keyword
Not kannst du nur in vergleichen benutzen, wie And oder Or.
für zuweisungen kannst du kein not benutzen.
Verfasst: 31.05.2007 17:07
von Kurzer
Alles klar. Danke. Dann muß ich das anders bauen.
Hmmm, mit Abs(Wert-1) sollte das gehen...?
Code: Alles auswählen
Debug #True
Debug #False
Debug Abs(#True-1)
Debug Abs(#False-1)
Markus
Verfasst: 31.05.2007 17:12
von D@nte
Hab grad auch mal den Schnipsel von Kurzer
durchlaufen lassen und dann bekomm ich ne Errormsg mit:
Line 2: t() is not a function, array, macro or linked list
Schon klar das nen Error kommt aber müßte das dann nicht so aussehen?!
Line 2:
Not() is not a function, array, macro or linked list
Verfasst: 31.05.2007 17:22
von Kaeru Gaman
o_O?
also, ich bekomme bei dem simplen Debug keine fehlermeldung. (aus dem oben angegebenen grund)
und wenn ich den Bug erzeuge, bekomme ich auch den text korrekt angezeigt.
du musst bei deiner abschrift nen typo drinhaben, den du in deinem posting nicht drinhast.
@Kurzer
Abs() wiederum funktioniert nur mit Floats, nicht mit Integer.
hab ich mich auch schon oft drüber geärgert.
probiers mal mit 1-Wert.
Code: Alles auswählen
Macro InvBool(Value)
(1-(Value))
EndMacro
Debug InvBool(#True)
Debug InvBool(#False)
aber vorsicht:
das funktioniert wirklich nur, wenn du die konstanten (also nur 0 oder 1) zurückgibst.
manche funktionen geben als True einen beschreibenden wert zurück, der alles andere als 1 sein kann, nur eben nicht 0...
Verfasst: 31.05.2007 17:32
von D@nte
>du musst bei deiner abschrift nen typo drinhaben, den du in deinem posting nicht drinhast.
Öhm naja wenn, dann sind meine STRG, C und V - Taste kaputt...
Allerdings geht (bei mir)
gibt 0 aus
(Wobei es egal zu sein scheint ob #True = 1 oder 123456789 ist)
gibt 1 aus
(nur wenn Konstante = 0 ist kommt 1 raus)
Verfasst: 31.05.2007 17:35
von Kurzer
Hmm, also ich habe da jetzt folgenden Code genommen:
Code: Alles auswählen
If ConnectState = #False
ConnectState = ConnectToDB()
Else
ConnectState = Abs(DisconnectFromDB()-1) ; das Abs ist ein Not() für #True und #False
EndIf
If ConnectState = #False
StatusBarText(#StatusBar_Main, 0, DBName$ + ": Keine Datenbankverbindung")
SetMenuItemState(#MenuBar, #MENU_Active, 0)
Else
StatusBarText(#StatusBar_Main, 0, DBName$ + ": Zur Datenbank verbunden")
SetMenuItemState(#MenuBar, #MENU_Active, 1)
EndIf
und der tut soweit gut, auch mit Abs().
Jedesmal wenn ich diesen Code aufrufe, dann connectet er sich und disconnected korrekt von der DB (toggle-modus).
1.0 scheint demnach auch #True zu sein, genau wie 1
Markus
PS: DisconnectFromDB() gibt #True zurück, wenn erfolgreich disconnected wurde, daher brauche ich an der Stelle eine Not() Funktion, um den richtigen "Bin ich gerade verbunden-Status" zu setzen.
Verfasst: 01.06.2007 10:26
von Little John
So geht's:
Code: Alles auswählen
Define.l F, T
F = (1=0) ; Hier _kann_ der zuzuweisende Ausdruck in Klammern stehen.
T = (Not F) ; Ein zuzuweisende Ausdruck mit 'Not' _muss_ in Klammern stehen.
Debug F
Debug T
Gruß, Little John
Verfasst: 01.06.2007 10:41
von Kaeru Gaman
@Little John
stimmt, hatte ich gestern ganz vergessen...
Code: Alles auswählen
T = (Not F) ; Ein zuzuweisende Ausdruck mit 'Not' _muss_ in Klammern stehen.
das ist völlig richtig, so kann man die umkehr eines Boolwertes durchführen.
ABER:
Code: Alles auswählen
F = (1=0) ; Hier _kann_ der zuzuweisende Ausdruck in Klammern stehen.
dieses hier ist komplett falsch!
PB unterstützt Boole'sche Ausdrücke in rechnungen und zuweisungen nicht,
bzw. nicht unbedingt mit den gewünschten ergebnissen.
Code: Alles auswählen
a = 4
b = 6
t = ( a = b )
If t = #False
Debug "ungleich"
Else
Debug "gleich"
EndIf
Debug "t = "+Str(t)
Verfasst: 01.06.2007 11:04
von Little John
Kurzer hat geschrieben:Hmmm, mit Abs(Wert-1) sollte das gehen...?
Code: Alles auswählen
Debug #True
Debug #False
Debug Abs(#True-1)
Debug Abs(#False-1)
Von solcherlei Dingen kann ich nur dringend abraten, weil das
mathematisch-logisch völlig falsch ist. Das impliziert, dass Code wie dieser
schlecht lesbar ist. Dadurch können sich auch
Fehler leicht einschleichen und schwer gefunden werden.
#True und #False sind
Boolsche Variablen, daher dürfen nach den Regeln der Mathematik auf diese nur
Boolsche Operatoren angewendet werden (siehe
Boolesche Algebra). Rechenoperationen wie Subtraktion und Funktionen wie Abs() sind mit Booleschen Variablen mathematisch nicht erlaubt.
Da PureBasic (wie viele andere Programmiersprachen) ganze Zahlen verwendet um #True und #False zu repräsentieren, und außerdem nicht steng überprüft wie der Programmierer das verwendet, ist soetwas wie
in PureBasic leider
technisch möglich.
Programme werden aber nicht nur für Interpreter oder Compiler geschrieben, sondern immer auch für Menschen, die sie lesen sollen.
Gruß, Little John