Seite 1 von 2

ProcedureReturn Not [Variable] = Fehler

Verfasst: 05.02.2010 00:11
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

Re: ProcedureReturn Not [Variable] = Fehler

Verfasst: 05.02.2010 00:25
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

Re: ProcedureReturn Not [Variable] = Fehler

Verfasst: 05.02.2010 00:32
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.

Re: ProcedureReturn Not [Variable] = Fehler

Verfasst: 05.02.2010 00:33
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. <)

Re: ProcedureReturn Not [Variable] = Fehler

Verfasst: 05.02.2010 00:34
von STARGÅTE
hier genau die gleiche Frage:
Operator NOT

Re: ProcedureReturn Not [Variable] = Fehler

Verfasst: 05.02.2010 05:36
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.

Re: ProcedureReturn Not [Variable] = Fehler

Verfasst: 05.02.2010 12:24
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

Re: ProcedureReturn Not [Variable] = Fehler

Verfasst: 05.02.2010 12:35
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

Re: ProcedureReturn Not [Variable] = Fehler

Verfasst: 05.02.2010 12:39
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:

Re: ProcedureReturn Not [Variable] = Fehler

Verfasst: 06.02.2010 10:02
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.