Not() mal geht's mal kennt er es nicht...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Not() mal geht's mal kennt er es nicht...

Beitrag 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? :)
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag 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
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag 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)
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag 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.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Little John

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Little John

Beitrag 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
Antworten