if-de :: Forum Foren-Übersicht
Autor Nachricht
<  Suffixes und dekl 0 läuft bei mir nicht
Kris
BeitragVerfasst am: Sa, 10 Apr 2004 - 14:59  Antworten mit Zitat
Kompassleser
Kompassleser


Anmeldungsdatum: 21.02.2004
Beiträge: 198
Wohnort: Rheinmain

Auch wenn die letzten Wochen fast nur Fragen von mir hier im Forum auftauchen, eine hab' ich noch:

Nachdem ich Probleme mit der Deklination eines Objektes hatte, habe ich mal den "Bauer" aus dem PDF "Informis_de" erstellt:

Code:
Object -> "Bauer"
with    dekl 0,
   suffixes "" "n" "n" "n", !Wichtig, dekl *muss* 0 sein
   each_turn [;
   print (des) self," -", (den) self," -", (dem) self," -", (der) self;
   ]
has male;


Each_turn habe ich eingesetzt, um jeden Turn alle Fälle angezeigt zu bekommen.

Und siehe da, es funktioniert gar nicht!?
Habe ich etwas grundlegendes überlesen oder gibt es da schon eine Korrektur?
Im Informissimus von Frank Borger steht auch nicht allzuviel darin.

Hier das Ergebnis:



Zitat:
>l
Startraum
Du befindest dich in einem Raum, der bar jeglicher bemerkenswerter Merkmale ist.

Du siehst hier einen Bauer und einen saftigen Knödel.
der Bauer -des Bauer -dem Bauer -den Bauer

>


Und wieder mal:

Danke jetzt schon für Hilfe :-)


Kris
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ChrisW
BeitragVerfasst am: Sa, 10 Apr 2004 - 15:28  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 26.08.2002
Beiträge: 278
Wohnort: Leipzig

Komisch. Ich habe wirklich _exakt_ deinen Quellcode übernommen (Copy&Paste) und es mal ausprobiert, und bei mir funktioniert es völlig problemlos. Kann dir da also leider nicht helfen...
_________________
"Ein Musiker! Was will der hier so spät?" Stolzing (Meistersinger v.N.)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Martin
BeitragVerfasst am: Sa, 10 Apr 2004 - 15:45  Antworten mit Zitat
Experte
Experte


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

ChrW hat folgendes geschrieben:
... und bei mir funktioniert es völlig problemlos.

...bei mir auch.

Hmm, vielleicht kommt eine deiner Erweiterungen da in die Quere? Vielleicht könntest du einmal deine eigenen Erweiterungen (der Verben und so) ausblenden und den Code dann noch einmal testen? (Du weißt schon, der Schmetterling im amazonischen Regenwald, der mit seinem Flügelschlag das Osterwetter in Oberbayern durcheinanderbringt. Die Inform-Lib und das Weltklima sind sehr komplexe Systeme...)

Ach ja, der Vollständigkeit halber:
Code:

Release 1 / Serial number 040410 / Inform v6.21 Library 6/10 (deutsch) SD
Standard interpreter 1.0 (6F) / Library serial number 991120(bp)
Offizielle deutsche Inform-Library, Release 19, Serial 021015

_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kris
BeitragVerfasst am: Sa, 10 Apr 2004 - 17:37  Antworten mit Zitat
Kompassleser
Kompassleser


Anmeldungsdatum: 21.02.2004
Beiträge: 198
Wohnort: Rheinmain

Sorry Leute,

ich hatte die tgerman von 2001, es konnte also nicht klappen.
(Ich muß wohl mal alle downloads sortieren bzw. den Informordner checken :-)

Jetzt habe ich aber ein anderes Problem (hatte auch schon vor der "neuen" tgerman).

short_name_indef wird nicht ausgegeben.

Code:
Object -> "Beamte"
with    dekl 0,
      short_name "Beamte",
      short_name_indef "Beamter",
      
      suffixes "" "n" "n" "n", !Wichtig, dekl *muss* 0 sein
      each_turn [;
      print (ein) self, (der) self," -", (des) self," -", (dem) self," -", (den) self;
      ]
has male;


Ergebnis:

Zitat:
>l

Startraum
Du befindest dich in einem Raum, der bar jeglicher bemerkenswerter Merkmale ist.

Du siehst hier einen Beamten und einen saftigen Knödel.
ein Beamteder Beamte -des Beamten -dem Beamten -den Beamten
>


Ich hatte es so verstanden, dass undefinierte Ausgabe (also (ein) self) (?) short_name_indef ausgibt.

Danke schon mal jetzt für eure Unterstützung!

Kris
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Martin
BeitragVerfasst am: Sa, 10 Apr 2004 - 19:05  Antworten mit Zitat
Experte
Experte


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

Zitat:
Ich hatte es so verstanden, dass undefinierte Ausgabe (also (ein) self) (?) short_name_indef ausgibt.

Theoretisch ist das wohl auch so, short_name_indef wird allerdings nur herangezogen, wenn die globale Variable indef_mode gesetzt ist. Diese wird im Moment von der Library allerdings nur während des Parsens gesetzt, um zwischen "nimm den Ball" und "nimm einen Ball" zu unterscheiden, bei der Ausgabe ist diese Flagge, so weit ich es gesehen habe, nicht berücksichtigt. (Außer bei der Ausgabe von Raumnamen, dann ist sie -1.)

Wenn ich diese Flagge in den Routinen ein, einen usw. setzte, klappt es, aber es passiert folgendes:

Code:

>dekl beamter

der Beamte
den Beamten
dem Beamten
des Beamten

ein Beamter
einen Beamtern
einem Beamtern
eines Beamtern


(Das Verb dekl ist immer aktiv, wenn das Spiel im Debug-Modus kompiliert wird, du brauchst also den Hack mit each_turn nicht.)

Die Endungen von "Beamter" stimmen übrigens mit den Endungen für Adjektive überein. Mein Duden lässt mich zwar darüber etwas im Unklaren, woher diese komische Dekination kommt, aber folgendes funktioniert...

Code:

Object -> "Beamte"
   with dekl 0,
        Adj "Beamt",
        short_name "",
        name 'beamter' 'beamten' 'beamte',
    has male;


... zwar auf den ersten Blick ganz gut:

Code:

>dekl beamten

der Beamte
den Beamten
dem Beamten
des Beamten

ein Beamter
einen Beamten
einem Beamten
eines Beamten


...aber eben nur auf den ersten Blick: Hinter dem Namen des Objekts wird jetzt immer ein Leerzeichen ausgegeben, was etwas unfein ist. Wenn man short_name und die Angabe des Namens im Objektkopf weglässt, heißt es in meinem Fall "Du siehst einen Beamten (40)".

Anregung für die Lib: Eine Konstante nur_Adjektiv oder adjective_only oder so für den short_name einführen, damit die Ausgabe des Namens nach dem Adjektiv aufhören kann. Dann kann man auch Namen wie "Ein Blinder" oder "ein Helles" definieren.

Workaround für dich: Wende die gesetzlich vorgeschriebene Frauenquote im öffentlichen Dienst auch auf deine NPCs an:

Code:

Object ->
   with dekl 0,
        short_name "Beamtin",
        name 'beamtin'
    has female;


Oder benutze T.A.G.:

Code:

Obj Beamter
Name 'Beamt^' m


(Na gut, beides nicht so besonders ernst gemeinte Vorschläge ;-)

Du könntest wohl aus suffixes auch eine Routine machen, aber ich glaube, die wird nur mit dem Fall als Argument aufgerufen, die Information, ob ein bestimmter oder unbestimmter Artikel verwendet wird, ist nicht verfügbar.
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kris
BeitragVerfasst am: So, 11 Apr 2004 - 12:59  Antworten mit Zitat
Kompassleser
Kompassleser


Anmeldungsdatum: 21.02.2004
Beiträge: 198
Wohnort: Rheinmain

Hallo Martin,

prinzipiell ist die Idee mit der Quotenfrau nicht schlecht, letztendlich würde der Beamte aber aufgrund seines Geschlechts benachteiligt werden, das wollen wir ja auch nicht ;-)

Aber im Ernst:

Warum wird indef_mode nicht von Inform gesetzt. Im DM4 Seite 270 steht folgendes:

Zitat:
In some languages, though not English, short names are inflected to make them agree
with the kind of article applied to them:

das rote Buch the red book (German)
ein rotes Buch a red book

In printing as in parsing, the library variable indef_mode holds true if an indefinite article attaches to the noun phrase and false otherwise. So one rather clumsy solution would be:

Object Buch
with ...
short_name [;
if (indef_mode) print "rotes Buch"; else print "rote Buch";
rtrue;
];

In fact, though, the library automatically looks for a short_name_indef property when
printing short names in indefinite cases, and uses this instead of short_name. So:

Object Buch
with short_name "rote Buch", short_name_indef "rotes Buch";


Hier nochmal die wichtigste Zeile:

Zitat:
In printing as in parsing, the library variable indef_mode holds true if an indefinite
article attaches to the noun phrase and false otherwise.


Also nicht nur beim Parsen, auch beim Schreiben.
Nur wird sie nicht gesetzt!??

Hat es etwas mit der deutschen Übersetzung zu tun?

Ich habe auch einiges Schmutzige versucht, um das Leerzeichen aus deiner Lösung weg zu bekommen:
Aber

short_name (char)8; !(char)8 entspricht [delete]

wird leider nicht akzeptiert (so'n Mist!!!)

Meine Versuche (z.B. print (ein)self,indef_mode) ergaben immer 0 (also false), ich weiß aber nicht, ob sie schon wieder zrückgesetzt wurde.
Gibt es eine Möglichkeit, die Variable zu verfolgen?

Grüße und ein Frohes Osterfest


Kris
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Martin
BeitragVerfasst am: So, 11 Apr 2004 - 18:35  Antworten mit Zitat
Experte
Experte


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

Zitat:
Gibt es eine Möglichkeit, die Variable zu verfolgen?

Ja, alle Routinen zur Ausgabe von Objektnamen rufen die Routine PSN__ auf (print short name, I assume). Dort habe ich in der ersten Zeile die Ausgabe von indef_mode platziert:
Code:

[ PSN__ o;
   #Ifdef DEBUG;
   print "(", indef_mode, ") ";
   #EndIf;
   if (o==0) { print (string) NOTHING__TX; rtrue; }
   ...
];

Und dann wird immer eine Null geschrieben, sprich, indef_mode wird nicht gesetzt wie im DM4 beschrieben.

Zitat:
Hat es etwas mit der deutschen Übersetzung zu tun?

Ja. In der Englischen Original-Lib wird indef_mode korrekt gesetzt: 0 für Ausgabe mit bestimmtem Artikel, 1 für die Ausgabe mit unbestimmtem Artikel und -1 für die Ausgabe ohne Artikel, wie z.B. bei Raumnamen in der Statuszeile oder bei den Angaben zum jeweils betrachteten Objekt bei Multi-Tokens.

Code:

[ Indefart o i;
    i = indef_mode; indef_mode = true;
    if (o has proper) { indef_mode = NULL; print (PSN__) o; return; }
    if (o provides article) {
        PrintOrRun(o, article, 1); print " ", (PSN__) o; indef_mode = i;
        return;
    }
    PrefaceByArticle(o, 2); indef_mode = i;
];


(IndefArt, CIndefArt, DefArt und CDefArt sind die Routinen, die bei den Ausgaberegeln (a), (A), (the) und (The) aufgerufen werden. (A) ist neu ab 6/11. Diese Zusammenhänge sind "fest verdrahtet", nehme ich an, da Inform bei Symbolnamen nicht auch Groß- und Kleinschreibung achtet und nur in diesem Spezialfall zwischen (the) und (The) unterscheidet. Es gibt keine Routine "the".)

Die deutsche Lib definiert die Ausgaberegeln in tgerman.h:

Code:

[ein obj;
  ta_printindefart(obj,0);
  print (PSN__) obj;
  ta_PrintNounSuffix(obj,0);
  ta_PrintPostNoun(obj);
];

Da ist nicht von indef_mode die Rede, es wird nicht gesetzt wie oben. Das war aber vielleicht auch von Toni Arnold nicht so vorgesehen, denn das Beispiel im DM4, das du zitiert hast, benutzt short_name_indef ja nur, um die Ausgabe des Adjektivs anzupassen, und das funktioniert ja auch nur im Nominativ. Als Ersatz hat die deutsche Lib ja das besser an die deutsche Sprache angepasste System der Adjektive.

Code:

short_name (char)8; !(char)8 entspricht [delete]

Hehe, clever gedacht, aber blöd^H^H^H^Hnicht optimal gfelaufen: ZSCII ist nicht ASCII, und das Zeichen mit dem Code 8 ist nur für die Eingabe definiert. Die z-Maschine ist erbarmungslos: Was einmal gedruckt wurde, ist gedruckt.

Deshalb folgender Vorschlag: Ersetze die Routine zur Ausgabe von Adjektiven am Anfang deines Code wie folgt:

Code:

Constant adj_only "";
Replace ta_PrintAdjectives;

Include "Parser";
Include "VerbLib";

[ta_PrintAdjectives obj typ case upper queue i;
  queue = false;   ! first adjective is printed without leading space
  if (obj provides adj) {
    for (i = 0: i < (obj.#adj)/WORDSIZE: i++) {
      if (queue) print " ";
      ta_PrintAdj(obj,obj.&adj-->i ,typ,case,i,upper);
      queue = true;
    }
  }
  if (obj provides short_name && obj.short_name == adj_only) queue = false;
  ! kein Leerzeichen, wenn short_name nicht ausgegeben wird

  if (queue) print " ";         ! last space after the adjectives
];


Dann definiere deinen Beamten so:

Code:

Object ->
   with dekl 0,
        Adj "Beamt",
        short_name adj_only,
        name 'beamter' 'beamten' 'beamte',
    has male;


Beim Beamten funktioniert's dann, wie es soll, der Code ist auch kompatibel zu eventuellen Post-Definitionen:

Code:

Object ->
   with dekl 0,
        Adj "Beamt",
        short_name adj_only,
        name 'beamter' 'beamten' 'beamte',
        post "der Post",
        ! Seit der Privatisierung der Post sachlich nicht ganz
        ! korrekt, aber meines Wissens die erste selbstbezügliche
        ! Post-Definition in der Geschichte der deutschen Inform-Lib.
    has male;

Object ->
   with dekl 0,
        Adj "Hell",
        short_name adj_only,
        name 'bier' 'hell',
        post "deiner Münchner Lieblingsbrauerei",
    has neuter;


Ich hoffe, dass dieser Code andere Objektnamen nicht durcheinanderbringt, denke es aber nicht, schließlich wurde nur etwas Neues eingefügt. Bitte prüfe den Code einmal in einem industriellen Testfall - ich hoffe, dein Spiel hat mehr als hundert Objekte, hehe. Wenn sich die Ergänzung bewährt, könnte man überlegen, sie in einer der nächsten Aktualisierungen zu übernehmen.
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Martin
BeitragVerfasst am: So, 11 Apr 2004 - 18:47  Antworten mit Zitat
Experte
Experte


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

Zitat:
Gibt es eine Möglichkeit, die Variable zu verfolgen?

Ja, alle Routinen zur Ausgabe von Objektnamen rufen die Routine PSN__ auf (print short name, I assume). Dort habe ich in der ersten Zeile die Ausgabe von indef_mode platziert:
Code:

[ PSN__ o;
   #Ifdef DEBUG;
   print "(", indef_mode, ") ";
   #EndIf;
   if (o==0) { print (string) NOTHING__TX; rtrue; }
   ...
];

Und dann wird immer eine Null geschrieben, sprich, indef_mode wird nicht gesetzt wie im DM4 beschrieben.

Zitat:
Hat es etwas mit der deutschen Übersetzung zu tun?

Ja. In der Englischen Original-Lib wird indef_mode korrekt gesetzt: 0 für Ausgabe mit bestimmtem Artikel, 1 für die Ausgabe mit unbestimmtem Artikel und -1 für die Ausgabe ohne Artikel, wie z.B. bei Raumnamen in der Statuszeile oder bei den Angaben zum jeweils betrachteten Objekt bei Multi-Tokens.

Code:

[ Indefart o i;
    i = indef_mode; indef_mode = true;
    if (o has proper) { indef_mode = NULL; print (PSN__) o; return; }
    if (o provides article) {
        PrintOrRun(o, article, 1); print " ", (PSN__) o; indef_mode = i;
        return;
    }
    PrefaceByArticle(o, 2); indef_mode = i;
];


(IndefArt, CIndefArt, DefArt und CDefArt sind die Routinen, die bei den Ausgaberegeln (a), (A), (the) und (The) aufgerufen werden. (A) ist neu ab 6/11. Diese Zusammenhänge sind "fest verdrahtet", nehme ich an, da Inform bei Symbolnamen nicht auch Groß- und Kleinschreibung achtet und nur in diesem Spezialfall zwischen (the) und (The) unterscheidet. Es gibt keine Routine "the".)

Die deutsche Lib definiert die Ausgaberegeln in tgerman.h:

Code:

[ein obj;
  ta_printindefart(obj,0);
  print (PSN__) obj;
  ta_PrintNounSuffix(obj,0);
  ta_PrintPostNoun(obj);
];

Da ist nicht von indef_mode die Rede, es wird nicht gesetzt wie oben. Das war aber vielleicht auch von Toni Arnold nicht so vorgesehen, denn das Beispiel im DM4, das du zitiert hast, benutzt short_name_indef ja nur, um die Ausgabe des Adjektivs anzupassen, und das funktioniert ja auch nur im Nominativ. Als Ersatz hat die deutsche Lib ja das besser an die deutsche Sprache angepasste System der Adjektive.

Code:

short_name (char)8; !(char)8 entspricht [delete]

Hehe, clever gedacht, aber blöd^H^H^H^Hnicht optimal gfelaufen: ZSCII ist nicht ASCII, und das Zeichen mit dem Code 8 ist nur für die Eingabe definiert. Die z-Maschine ist erbarmungslos: Was einmal gedruckt wurde, ist gedruckt.

Deshalb folgender Vorschlag: Ersetze die Routine zur Ausgabe von Adjektiven am Anfang deines Code wie folgt:

Code:

Constant adj_only "";
Replace ta_PrintAdjectives;

Include "Parser";
Include "VerbLib";

[ta_PrintAdjectives obj typ case upper queue i;
  queue = false;   ! first adjective is printed without leading space
  if (obj provides adj) {
    for (i = 0: i < (obj.#adj)/WORDSIZE: i++) {
      if (queue) print " ";
      ta_PrintAdj(obj,obj.&adj-->i ,typ,case,i,upper);
      queue = true;
    }
  }
  if (obj provides short_name && obj.short_name == adj_only) queue = false;
  ! kein Leerzeichen, wenn short_name nicht ausgegeben wird

  if (queue) print " ";         ! last space after the adjectives
];


Dann definiere deinen Beamten so:

Code:

Object ->
   with dekl 0,
        Adj "Beamt",
        short_name adj_only,
        name 'beamter' 'beamten' 'beamte',
    has male;


Beim Beamten funktioniert's dann, wie es soll, der Code ist auch kompatibel zu eventuellen Post-Definitionen:

Code:

Object ->
   with dekl 0,
        Adj "Beamt",
        short_name adj_only,
        name 'beamter' 'beamten' 'beamte',
        post "der Post",
        ! Seit der Privatisierung der Post sachlich nicht ganz
        ! korrekt, aber meines Wissens die erste selbstbezügliche
        ! Post-Definition in der Geschichte der deutschen Inform-Lib.
    has male;

Object ->
   with dekl 0,
        Adj "Hell",
        short_name adj_only,
        name 'bier' 'hell',
        post "deiner Münchner Lieblingsbrauerei",
    has neuter;


Ich hoffe, dass dieser Code andere Objektnamen nicht durcheinanderbringt, denke es aber nicht, schließlich wurde nur etwas Neues eingefügt. Bitte prüfe den Code einmal in einem industriellen Testfall - ich hoffe, dein Spiel hat mehr als hundert Objekte, hehe. Wenn sich die Ergänzung bewährt, könnte man überlegen, sie in einer der nächsten Aktualisierungen zu übernehmen.
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kris
BeitragVerfasst am: So, 11 Apr 2004 - 20:15  Antworten mit Zitat
Kompassleser
Kompassleser


Anmeldungsdatum: 21.02.2004
Beiträge: 198
Wohnort: Rheinmain

Hi Martin,

danke für deine Hilfe. Sonst hätte es halt doch erstmal eine Beamtin gegeben.

Zitat:
- ich hoffe, dein Spiel hat mehr als hundert Objekte, hehe.


Auf Papier schon, bin aber im Code erst bei etwas über 30.

Werde den Beamten so implementieren und so oder so mal eine Meldung dazu geben.

Ansonsten "Hut ab", klasse Lösung.

Als ich mich vor ein paar Monaten für Inform entschied, war es Nostalgie (Infocom) und der Glaube, das ausgereifteste (weil schon sehr lange in Gebrauch) System gewählt zu haben. Aber ich merke schon, man kann noch viel in der Mechanik wurschteln :-) (was ja auch nicht verkehrt ist)

Vielen Dank

Kris
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