IF-Forum

» IF-Forum - Autorencafé - Schreiben! - I6: Murks bei CompassDirections?
AntwortenNeues ThemaNeue Umfrage

I6: Murks bei CompassDirections?

Geschrieben um 20:23 am 14.04.2011 | Zitat | Editieren | Löschen
C++
Mitglied
Bachelor Gumby
Beiträge: 40

Moin an alle!

Mir ist gerade etwas aufgefallen, das ich (wie so oft...) nicht verstehe. Falls das hier schon behandelt wurde, freue ich mich über einen Link:

Um von einem Straßenabschnitt auf einen Hinterhof zu kommen, habe ich einen Durchgang programmiert, der je nach location nach Norden oder Süden führt. Dies soll in der initial-Property genannt werden.

Der Gang sieht so aus:


Object gang_W1 "Gang"

with   description "Der Durchgang ist so schmal, dass höchstens

          eine Person mittlerer Statur hindurchpasst.",

     name 'gang' 'durchgang',

     initial [; print "Ein schmaler Gang führt nach ";

!      print (name) self.door_dir();

       print (name) n_to;

       print ".";

     ],

     door_dir [; if (location == strasse_W1) return n_to;

       else return s_to;

     ],

     door_to [; print "Du zwängst dich durch den engen Gang. Vor

       dir huschen ein paar Ratten über den Boden.";

       if (location == strasse_W1) return hof_W1;

       else return strasse_W1;

     ],

     found_in strasse_W1 hof_W1,

has male door static open;

So, wie er da steht, führt er von beiden Orten angeblich nach Norden, aber das ist nicht mein Problem. Die auskommentierte Zeile spricht über die door_dir-Prop denselben Fehler an: In der Raumbeschreibung der Straße steht nämlich:

Zitat:

Ein schmaler Gang führt nach Nordosten.

(Versuche mit print (string) statt (name) haben erwartungsgemäß noch seltsamere Ausgaben nach sich gezogen.)

Ist jemandem von euch dieses Problem schon mal aufgefallen? Ich kann mir vorstellen, dass irgendetwas in der German.h nicht korrekt zugewiesen wird.

Ob Bug oder fehlende Kenntnis des Programmkern meinerseits - das Problem lässt sich ja leicht umgehen, indem ich qua Fallunterscheidung die Richtung des Gangs selbst schreibe. Ich frage mich nur, wo der Wurm drin ist.

Schöne Grüße,

Christof

Geschrieben um 22:25 am 14.04.2011 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

Moin Christof,

Du versuchst, den Namen einer Objekteigenschaft auszugeben.

Zitat:

print (name) n_to;

Das kann nicht funktionieren. Wenn Du auf eine konkrete Objekteigenschaft zugreifen möchtest, geht das mit <Objekt>.<Eigenschaft>, also z.B. self.n_to.

Edit: Der Compiler gibt hier auch eine Warnung aus:

Inform 6:

line 71: Warning: Bare property name found. "self.prop" intended?

   print (name) n_to;

Aber was Du hier machen möchtest, ist wahrscheinlich den Namen des Objekts "Norden" ausgeben zu lassen. Der Norden als Objekt heißt in Inform n_obj. Analog dazu heißen die anderen Richtungen s_obj, e_obj usw.



print " ergibt das gleiche wie ";

print "Norden";```

Viele Grüße,

Christian
Geschrieben um 23:41 am 14.04.2011 | Zitat | Editieren | Löschen
C++
Mitglied
Bachelor Gumby
Beiträge: 40

Schönen Dank, Christian!

DM4 schreibt dazu:

Zitat:

Confusing the direction objects with the direction properties is easily done (...)

Der Unterschied war mir eigentlich klar, aber eben nicht präsent. So wie ich das entsprechende Kapitel und die Informisiererei überhaupt verstanden habe, gilt Folgendes:

  1. Es ist m.o.w. Zufall, dass Inform als Namen für das unbekannte Objekt n_to den Namen des Objects ne_obj ausgibt; es könnte auch der eines anderen Datenbankeintrags sein.

  2. Man könnte ja - wenn man partout die Fallunterscheidung nicht im Initial haben will - für den Gang eine Property definieren, die als Rückgabewert n_obj und nicht n_to hat; dann würde es gehen. Das wäre für den geschilderten Einsatz natürlich von hinten durch die Brust ins Auge...

Korrigiere mich bitte, wenn ich falsch liege. (Hat keine Eile, da der Fehler schon längst behoben ist.)

Schöne Grüße,

Christof

Geschrieben um 08:45 am 15.04.2011 | Zitat | Editieren | Löschen
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

C++:

  1. Es ist m.o.w. Zufall, dass Inform als Namen für das unbekannte Objekt n_to den Namen des Objects ne_obj ausgibt; es könnte auch der eines anderen Datenbankeintrags sein.

Genau. Intern sind natürlich alles Zahlen:


    print "n_to == ", n_to, "^";

    print "n_obj == ", n_obj, "^";

Es wurde einmal gefordert, dass die Richtungsobjekte und -eigenschaften so definiert werden, dass sie gleich sind. (Wenn der Autor vor dem Einbinden der lib keine eigenen Properties oder Objekte definiert und keine anderen Header einbindet.) Und wenn ich ein kleines Beispiel mit deform kompiliere, ist das auch so.

Wird in Deinem oder in einem eingebundenen Quelltext vor dem Einbinden von "Parser.h" eine Eigenschaft mit Property definiert?

C++:

  1. Man könnte ja - wenn man partout die Fallunterscheidung nicht im Initial haben will - für den Gang eine Property definieren, die als Rückgabewert n_obj und nicht n_to hat; dann würde es gehen. Das wäre für den geschilderten Einsatz natürlich von hinten durch die Brust ins Auge...

Es gibt eine Routine LanguageDirection, die zu jeder Property die Richtung ausgibt:


     initial &#91;;

        print "Ein schmaler Gang führt nach ",

            &#40;LanguageDirection&#41; self.door_dir&#40;&#41;, ".";

     &#93;, ...

(Es gibt auch LanguageDirectionAdj, das dann "nördlich" usw. ausgibt. (Allerdings funktioniert das nicht sehr gut bei den "normalen" Richtungen oben, unten, rein und raus, weil ich kein schönes, allgemein gültiges Adjektiv gefunden habe, das für Ausdrücke wie "nördliche Wand" oder "in nördliche Richtung" passt. Vielleicht ober(e), unter(e), inner(e) und äußer(e)?)

Geschrieben um 20:10 am 19.04.2011 | Zitat | Editieren | Löschen
C++
Mitglied
Bachelor Gumby
Beiträge: 40

Hi Martin,

vielen Dank, klappt prima! Die Routine steht sogar im DM4, aber in einem Teil, den ich noch nicht auswendig gelernt habe, und sie macht genau die Fallunterscheidung, die ich mir dann sparen kann.

Christof

AntwortenNeues ThemaNeue Umfrage
Powered by Spam Board SVN © 2007 - 2021
Impressum / Datenschutz