BrettspielWelt

Technische Fragen => Puppet-Stuff => Thema gestartet von: Chazar am 15.03.2008, 20:27:36



Titel: BUG: WHEREIS STARTER
Beitrag von: Chazar am 15.03.2008, 20:27:36
1) Wenn der Starter schon ausgeloggt ist, erhalte ich auf die Anweisung WHEREIS STARTER sofort den Fehler java.lang.NullPointerException. Ist das nicht ein wenig übertrieben? Sollte die Variable ROOM in diesem Fall nicht einfach nicht existieren oder leer sein? Natürlich kann man den Namen des Starters in einer Variablen speichern und mit GETINFO überprüfen, aber ich brauche die Raumnummer ohnehin.

(EDIT/UPDATE: Fehler wurde behoben, siehe Thread (http://www.brettspielwelt.de/Forum/index.php/topic,114008.msg925363.html#msg925363)

2) Auch habe ich Probleme mit EXISTS: Mit einem ausgedachten Variablennamen xyz gilt in Versuchen immer immer ( EXISTS xyz ) == ( NOT ( ISEMPTY [xyz] ) ). Also habe ich fast überall NOT ISEMPTY durch EXISTS ersetzt und bekam prompt Probleme: Bei Variablen wie SUBST1 oder PARAM stimmt die Gleichung nicht! Diese können leer sein und trotzdem existieren, wieso? Oder habe ich es hier einfach nur mit Listen zu tun, die lediglich die leere Liste enthalten? Muss ich diese von Info-Befehlen gesetzen Variablen immer mit ISEMPTY untersuchen?


Titel: Re: BUG: WHEREIS STARTER
Beitrag von: SLC am 16.03.2008, 01:45:35
NOT EXISTS var -> die Variable gibt es nicht (oder wurde mit UNSET vernichtet)
ISEMPTY [var] -> die Variable enthält einen Leerstring (leere Liste)

Das ist schon 2 paar Schuhe, auch wenn im 2. Fall sogar eine
nicht vorhanden Variable erlaubt ist (und zu "" wird),
wodurch es eigentlich nur den beschriebenen Unterschied gibt:
Ist var mit dem Wert "" belegt, dann ist NOT EXISTS var
zwar FALSE, aber ISEMPTY [var] ist TRUE... ;D

Man achte übrigens drauf, was passiert, wenn man eine
LOCAL-Variable gleichen Namens mit UNSET bearbeitet! ;D

Grüße, SLC


Titel: Re: BUG: WHEREIS STARTER
Beitrag von: Chazar am 16.03.2008, 13:55:15
Das Problem ist aber, das
Code:
LOCAL x
IF EXISTS x
 >> Nie, es sei denn es gibt ein globales x
ELSE
 >> Immer.
gilt! Es gibt also einen Unterschied zwischen LOCAL x und LOCAL x = ""

Welcher Code ist dann also besser:
Code:
LOCAL x
IF ...
  EVAL x = ...
ELSE
  EVAL x = ...
oder
Code:
IF ...
  EVAL x = ...
ELSE
  EVAL x = ...
UNSET x
wenn x ohnehin nicht global existiert, also ein temporäres verdecken ausgeschlossen ist?

---

Abgesehen von diesen Feinheiten, was ist mit meiner ersten Frage im ersten Post in diesem Thread? Bug oder Feature?


Titel: Re: BUG: WHEREIS STARTER
Beitrag von: SLC am 16.03.2008, 15:17:52
Moin!

Das Problem ist aber, das
Code:
LOCAL x
IF EXISTS x
 >> Nie, es sei denn es gibt ein globales x
ELSE
 >> Immer.
gilt! Es gibt also einen Unterschied zwischen LOCAL x und LOCAL x = ""

Eigentlich andersrum. Nach "LOCAL x" sollte "EXISTS x" immer TRUE liefern.
Falls nicht -> BUG! ;D

Grüße, SLC


Titel: Re: BUG: WHEREIS STARTER
Beitrag von: Chazar am 16.03.2008, 16:49:31
Eigentlich andersrum. Nach "LOCAL x" sollte "EXISTS x" immer TRUE liefern.
Falls nicht -> BUG! ;D

Das ist ja mal eine klare, verlässliche Antwort! ;D
Also ist es ein BUG:

Code:
    -- EXISTS nixda: [=EXISTS nixda]
    -- ISEMPTY nixda: [=ISEMPTY [nixda]]
    -- ISINTEGER nixda: [=ISINTEGER [nixda]]
    LOCAL nixda
    -- LOCAL nixda
    -- EXISTS nixda: [=EXISTS nixda]
    -- ISEMPTY nixda: [=ISEMPTY [nixda]]
    -- ISINTEGER nixda: [=ISINTEGER [nixda]]
    EVAL nixda = "123"
    -- EVAL nixda = "123"
    -- EXISTS nixda: [=EXISTS nixda]
    -- ISEMPTY nixda: [=ISEMPTY [nixda]]
    -- ISINTEGER nixda: [=ISINTEGER [nixda]]
    UNSET nixda
    -- UNSET nixda
    -- EXISTS nixda: [=EXISTS nixda]
    -- ISEMPTY nixda: [=ISEMPTY [nixda]]
    -- ISINTEGER nixda: [=ISINTEGER [nixda]]
<OUTPUT>
-- [Timaer] EXISTS nixda: FALSE
-- [Timaer] ISEMPTY nixda: TRUE
-- [Timaer] ISINTEGER nixda: FALSE
-- [Timaer] LOCAL nixda
-- [Timaer] EXISTS nixda: FALSE
-- [Timaer] ISEMPTY nixda: TRUE
-- [Timaer] ISINTEGER nixda: FALSE
-- [Timaer] EVAL nixda = "123"
-- [Timaer] EXISTS nixda: TRUE
-- [Timaer] ISEMPTY nixda: FALSE
-- [Timaer] ISINTEGER nixda: TRUE
-- [Timaer] UNSET nixda
-- [Timaer] EXISTS nixda: FALSE
-- [Timaer] ISEMPTY nixda: TRUE
-- [Timaer] ISINTEGER nixda: FALSE
Den Test hatte ich vor 2-3 Tagen durchgeführt, auf die Idee LOCAL = "" kam ich damals noch nicht.

Gruß, Chazar, der immer noch auf eine Antwort zur wichtigeren Frage nach WHEREIS STARTER wartet. ;)