Forum moved to if-forum.org
Autor Nachricht
<  I6: Murks bei CompassDirections?
C++
BeitragVerfasst am: Do, 14 Apr 2011 - 19:23  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 21.12.2009
Beiträge: 45
Wohnort: Kiel

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:

Code:

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
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ChristianB
BeitragVerfasst am: Do, 14 Apr 2011 - 21:25  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg

Moin Christof,

Du versuchst, den Namen einer Objekteigenschaft auszugeben.

Zitat:
Code:
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 hat folgendes geschrieben:
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.

Code:
print (name) n_obj;
print " ergibt das gleiche wie ";
print "Norden";


Viele Grüße,
Christian
_________________
Worichtung willst du ingehen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
C++
BeitragVerfasst am: Do, 14 Apr 2011 - 22:41  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 21.12.2009
Beiträge: 45
Wohnort: Kiel

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
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Martin
BeitragVerfasst am: Fr, 15 Apr 2011 - 7:45  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München

C++ hat folgendes geschrieben:
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:

Code:

    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++ hat folgendes geschrieben:
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...

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

Code:

     initial [;
        print "Ein schmaler Gang führt nach ",
            (LanguageDirection) self.door_dir(), ".";
     ], ...

(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)?)
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
C++
BeitragVerfasst am: Di, 19 Apr 2011 - 19:10  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 21.12.2009
Beiträge: 45
Wohnort: Kiel

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
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Alle Zeiten sind GMT + 1 Stunde (MEZ)

Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Seite 1 von 1
if-de :: Forum Foren-Übersicht  >  Inform & Glulx

Neues Thema eröffnen   Neue Antwort erstellen


 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.



Kontakt: Administrator

Powered by phpBB and NoseBleed v1.05