ProcedureReturn Not [Variable] = Fehler

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

ProcedureReturn Not [Variable] = Fehler

Beitrag von Kurzer »

Hallo,

ich weiß nicht, ob es ein Fehler ist, aber die NOTs in diesem Beispiel werfen eine Fehlermeldung, wenn sie nicht umklammert sind:

Code: Alles auswählen

Procedure.i Test()

;	ProcedureReturn Not #True   ; geht nicht
;	ProcedureReturn Not 0       ; geht nicht
;	ProcedureReturn (Not #True) ; geht
	ProcedureReturn (Not 0)     ; geht

EndProcedure

Debug #True
Debug #False
Debug Test()
Ohne Klammer gibt es die Kompilermeldung:
"Unbrauchbarer Code am Ende der Zeile"

PB 4.41, Win XP Home SP3
"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
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: ProcedureReturn Not [Variable] = Fehler

Beitrag von STARGÅTE »

Not ist keine Rechenoberation, sondern gehört in die Aussagenlogik!

#True und #False sind keine Wahrheitswerte von Aussagen, sonden nur zahlen (1 und 0) !

PB erlaubt es nicht explizit, Logische Ausdrücke in Termen zu verwenden !

die Klammer dienen hier mehr als Trick, damit etwas geht, was nicht erwünscht ist.

Hier mehr:
#True is only 1, not all True
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: ProcedureReturn Not [Variable] = Fehler

Beitrag von Kaeru Gaman »

und sowas ins Bug-Forum????

dz dz dz... schäm dich, Kermit! *Papiermütz aufsetz*

der Compiler hat dir klipp und klar gesagt, was du da produzierst: unbrauchbaren Code.

das mag eine "Was mache ich falsch" Frage wert sein, aber keine Bugmeldung.
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

Re: ProcedureReturn Not [Variable] = Fehler

Beitrag von Kurzer »

Alles klar Stargate, danke für die Aufklärung.
(sich die Sache mit den Bienen und den Blumen nochmal durch den Kopf gehen läßt) <)

Edit: Oh nein Kaeru hat mich ins Anfängerforum verschoben - ich stehe quasi am Pranger :oops:
Nun gut, ich werde mich heute Abend, ob meiner durch Schläfrigkeit begründeten Dummheit, eine halbe Stunde lang selbst kasteien.
(hmm, nehme ich die siebenschwänzige Katze oder lege ich mir doch eher ein Dornenband um den Oberschenkel? :roll: )

Okay serious... sorry für diesen Fehltritt. Aber trotzdem toll, daß es mit den Klammern geht. <)
Zuletzt geändert von Kurzer am 05.02.2010 00:38, insgesamt 1-mal geändert.
"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
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: ProcedureReturn Not [Variable] = Fehler

Beitrag von STARGÅTE »

hier genau die gleiche Frage:
Operator NOT
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Re: ProcedureReturn Not [Variable] = Fehler

Beitrag von Pelagio »

Guten Morgen.

Kurzer, ich glaube du braust dich nicht gleich kasteien eher sollten andere etwas flexibler sein denn deine Frage ergibt einen Sinn wenn eine Variable als #True/#False Flag in einem Programm benutzt wird. Ich selber benutzte dies schon mehrfach als Steuerungshilfe, denn statt

Code: Alles auswählen

Flag.a = #True
........
IF (Flag=#True): Flag = #False: ELSE: Flag = #True: ENDIF
schreibt man

Code: Alles auswählen

Flag = #True
........
Flag = (NOT Flag)
Es ist zwar unwahrscheinlich das ich dies aus einer Procedure übergebe aber vorstellen kann ich es mir schon.
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: ProcedureReturn Not [Variable] = Fehler

Beitrag von Kaeru Gaman »

@Pelagio

Not ist aber ein Logischer und kein Arithmetischer Operator!

also kann einem Wert überhaupt nicht "Not Irgendwas" zugewiesen werden, du kannst nur fragen, ob irgendwas Not ist.

Code: Alles auswählen

If a=0 And Not b=1
dein Code ist also auch schlicht falsch, und wenn er zufällig funktioniert, hast du zufällig getroffen.

____________________________________________________________________________________________________

An deine Problemstellung muss man anders herangehen.

normalerweise würde ich dort direkt mit 0 und 1 arbeiten, dann ist die Lösung besser sichtbar:

Code: Alles auswählen

Flag = 0

For n=0 To 15
  Flag = 1 - Flag
  Debug Flag
Next
wenn du unbedingt mit #True und #False arbeiten willst, musst du natürlich wissen, welchen Zahlenwert sie repräsentieren, um solche Kniffe anzuwenden.

Code: Alles auswählen

Flag = #False

For n=0 To 15
  Flag = #True - Flag
  Debug Flag
Next
sowas extra zu implementieren ginge zwar, wäre aber hochredundant, weil es nur für 0/1 Flaggen-Variablennamen funktionierte:

Code: Alles auswählen

Macro FlagInvert ( _VAR_NAME_ )
  _VAR_NAME_ = ( 1 -  _VAR_NAME_  )
EndMacro

Flag = #False

For n=0 To 15
  FlagInvert( Flag )
  Debug Flag
Next
außerdem kann man solche FlipFlops für jede beliebige zwei Werte bauen:

Code: Alles auswählen

Wert1 = Random( 10000 ) - 5000
Wert2 = Random( 10000 ) - 5000
Debug "Wert1 = " + Str( Wert1 )
Debug "Wert2 = " + Str( Wert2 )
Debug "---------------------"
Debug "FlipFlop"
Debug "---------------------"

Flag = Wert1
Ceiling = Wert1 + Wert2

For n=0 To 15
  Flag = Ceiling - Flag
  Debug Flag
Next
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: ProcedureReturn Not [Variable] = Fehler

Beitrag von ts-soft »

Kaeru Gaman hat geschrieben: An deine Problemstellung muss man anders herangehen.

normalerweise würde ich dort direkt mit 0 und 1 arbeiten, dann ist die Lösung besser sichtbar:

Code: Alles auswählen

Flag = 0

For n=0 To 15
  Flag = 1 - Flag
  Debug Flag
Next
Da nehm ich doch besser ein Bitweise XOR:

Code: Alles auswählen

Flag = 0

For n = 0 To 15
  Flag ! 1
  Debug Flag
Next 
Gruß
Thomas
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: ProcedureReturn Not [Variable] = Fehler

Beitrag von Kaeru Gaman »

das käme Pelagios angestrebter Schreibweise wohl auch noch am nächsten....

Flag ! #True

Code: Alles auswählen

Flag = #False

For n = 0 To 15
  Flag ! #True
  Debug Flag
Next 
... aber wie sähe das für beliebige Werte aus...? :mrgreen:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Re: ProcedureReturn Not [Variable] = Fehler

Beitrag von Pelagio »

Hallo,

ich wollte zwar auf das Thema nicht noch einmal eingehen aber es läst mir keine Ruhe.
Ich denke das der gedankliche Ansatz und die Vorstellung der Möglichkeiten unterschiedlich gesehen werden können. Ich möchte erst einmal klar stellen das ich auch in NOT einen logischen und keinen arithmetischen Operator sehe, trotzdem kann man ihn nicht bei der Benutzung aussen vorlassen.
Den Flag der benutzt wird ist nur ein Schalter der den binären Zustand darstellt, Aus(False, Falsch, 0) oder Ein(True, Wahr, 1). Also 'NOT Aus' = Ein und 'NOT Ein' = Aus. Ich frage also keinen arithmetisches sonder ein logisches Ergebnis ab und dies ist, meiner Meinung nach, kein Fehler.
In der Hilfe heist es
Die If Struktur wird zu Testzwecken benutzt und/oder um die Richtung der weiteren Programmausführung zu ändern, abhängig davon ob der Test wahr oder falsch ergibt. Das optionale Else wird benutzt, um einen Teil des Programm-Codes auszuführen, wenn der Test falsch ergibt.
Das heißt wenn ich schreibe

Code: Alles auswählen

Flag.a = 0
If Flag=0: Flag = 1: EndIf
;könnte ich auch schreiben
If Not Flag: Flag = 1: EndIf
; statt 0 = #False, 1 = #True einsetzbar
Die Abfrage nach IF wird intern jetzt mit Wahr oder Falsch beantwortet wobei beide Aussagen logisch interpretiert werden. Diese Interpretation findet aber auch ohne IF bei '(NOT Flag)' statt.
Ich hoffe ich konnte meine Gedankengänge bezüglich dieses Themas etwas verständlicher darlegen.
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
Antworten