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:

Code: Alles auswählen

Debug #True
Debug Not(#True)
Schreibe ich in meinem Programm aber:

Code: Alles auswählen

ConnectState = Not(DisconnectFromDB())
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:

Code: Alles auswählen

a = Not(#True)
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. :allright:

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

Code: Alles auswählen

Debug #True
Debug Not(#True)
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...
Bild

Allerdings geht (bei mir)

Code: Alles auswählen

Debug Not + #True
gibt 0 aus
(Wobei es egal zu sein scheint ob #True = 1 oder 123456789 ist)

Code: Alles auswählen

Debug Not + #False
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

Code: Alles auswählen

a = #True - 1
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