if-de :: Forum Foren-Übersicht
Autor Nachricht
<  Statuszeile
Christoph
BeitragVerfasst am: So, 14 März 2004 - 18:50  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 26.08.2002
Beiträge: 40

Hallo Informer,

ich bin da auf ein ganz seltsam anmutendes Problem gestoßen:

Wenn der short_name bestimmter Objekte ausgegeben wird, sei es per >inventar oder nach dem Schema "Du siehst hier den Hebel", ändert sich die Statuszeile auf "Zeit: 24:0-1 Uhr".

Offensíchtlich ist das immer dann der Fall, wenn das betreffende Objekt eine article-property besitzt, die aus zwei oder drei Buchstaben besteht, also auch "der", "die" und "das". Allerdings auch bei unsinnigen Kombinationen wie "urx" oder "fg".

Kann sich da jemand einen Reim drauf machen?
Das Problem tritt mit der neuesten Version 19 der deutschen Library auf, war aber auch schon in Version 18 vorhanden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ChrisW
BeitragVerfasst am: So, 14 März 2004 - 20:14  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 26.08.2002
Beiträge: 278
Wohnort: Leipzig

Hab kurz mal versucht, das nachzuvollziehen, aber bei mir ist es nicht aufgetreten. Hast du mal ein Stück Beispielcode, mit dem das bei dir "klappt"?
_________________
"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
Frottee
BeitragVerfasst am: So, 14 März 2004 - 23:11  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 07.06.2003
Beiträge: 35

Bei meinem Projekt passiert mir das ganze auch, und zwar immer, wenn der short_name des folgenden Objekts ausgegeben wird:

Code:
Object Muenzen "Münzen" Schale
with dekl 0,
     changing_gender,
     name 'muenzen' 'muenze' 'geld' neuter 'kleingeld' neuter,
     article "einige",
     before [;  ...da kommt ne längere before-property... ],
has female pluralname;


Ich weiß nicht, ob es tatsächlich an der article-Property liegt. Ein anderes Objekt zumindest, das den article "dein" trägt, verursacht nicht diesen Fehler... seltsam!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Martin
BeitragVerfasst am: Mo, 15 März 2004 - 20:40  Antworten mit Zitat
Experte
Experte


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

Das ist ein Bug in der Lib, und zwar ein nicht ganz ungefährlicher, weil versehentlich Daten in den Header geschrieben werden.

In tgerman.h, Zeile 294 heißt es:

Code:

294:[ta_printIndefart obj case art a;
295:  if ((obj provides article) && (obj hasnt proper)) {
296:                                         ! --- indefinite article provided by object
297:    a = obj.article;                        ! a is a number is a string
298:    if (a == definit) {                        ! force definite aricle
299:      ta_printdefart(obj,case);
300:    } else {
301:      if (metaclass(a) == string) {        ! could be a routine
302:        a.print_to_array(art);                ! art is a word array
303:        if (art-->0 == 0) {                 ! omit space if it is the null article
304:          ta_printAdjectives(obj,1,case); ! no article -> AdjDecl-Type 1
305:        } else {
306:          print (string) a;
307:          print " ";
308:          ta_printAdjectives(obj,1,case); ! "article" sing -> AdjDecl 1
309:        }
310:      } else {                                ! obj.article is a routine
usw:    ...


Die Eigenschaft article kann ein String, eine Routine oder die Konstante indefinit sein. Ein article-String kann auch leer sein, dann soll natürlich kein Leerzeichen vor dem eigentlichen Namen ausgegeben werden. Um das zu überprüfen wird der String mit print_to_array auf das Hilfsfeld art geschrieben (Zeile 302). Die ersten beiden Einträge dieses Byte-Felds geben die Länge des Strings an.

art ist hier allerdings eine lokale Variable, die nicht initialisiert wird, und die auch von keinem der vier Aufrufe von ta_printIndefart übergeben wird. Also wird die Länge des Strings und natürlich der String selbst in den Header der z-Code-Datei geschrieben.

Zum Glück sind die meisten Einträge im Header schreibgeschützt, so dass wichtige Adressreferenzen erhalten bleiben. In Byte 1 werden allerdings einige Flaggen für den Interpreter gesetzt, dies kann eigentlich nur der Terp selbst mit den geeigneten Opcodes machen. Offensichtlich lassen einige Interpreter dieses Bit aber überschreiben.

In Bit 1 von Byte 1, sozusagen (0->1) & 2, wird ab Version 3 festgelegt, ob rechts die Punktzahl oder die Uhrzeit stehen soll. Die Standard-Statuszeile in V5 und V8 imitiert dieses Verhalten und schaut im Header nach, welchen Stil es verwenden sollte. Hat das zuletzt ausgegebene Objekt mit einem article-String 2 (fg), 3 (urx), 6 (einige), 7, 10, 11 usw. Buchstaben, wird die Zeit genommen. Der Vierer "dein" kommt ungeschoren davon und schreibt die Punktzahl. Da wohl keine geegnete Zeit mit SetTime angegeben wurde, ist die -1, daher das komische Format der Uhrzeit.

Ich schlage vor, in zukünftigen Libs anstelle des leeren Strings eine weitere Konstante einzufügen, die den Artikel unterdrückt und das Schreiben aufs Feld ganz wegzulassen. Ein Workaround ist, eine Routine anzugeben, die den Artikel schreibt.
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Frottee
BeitragVerfasst am: Mo, 15 März 2004 - 21:32  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 07.06.2003
Beiträge: 35

Vielen Dank für die Erklärung, Martin.
Eine kurze Frage noch: wenn ich in meinem TA die Routine DrawStatusLine überschreibe, betrifft mich das Problem dann noch oder kann ich es ignorieren?
Sollte ich trotzdem darauf achten, die article-Properties als Routinen zu formulieren, um dem Interpreter Durcheinander zu ersparen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christoph
BeitragVerfasst am: Mo, 15 März 2004 - 23:46  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 26.08.2002
Beiträge: 40

Puh - vielen Dank für die ausführliche Analyse, Martin. Ich werde allerdings gar nicht erst so tun, als verstünde ich auch nur die Hälfte davon. Da zeigt sich halt der Unterschied zwischen Programmierer und Hobby-Coder :-)

Danke auch für den Tipp mit der Routine, das werde ich morgen direkt mal ausprobieren.

Frottee: Falls dir das hilft: Ich habe eine eigene DrawStatusLine-Routine, die praktisch eine Abwandlung der vorgegebenen darstellt, diese aber ersetzt. Das Problem tritt aber immer noch auf.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Martin
BeitragVerfasst am: Do, 18 März 2004 - 8:21  Antworten mit Zitat
Experte
Experte


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

Frottee hat folgendes geschrieben:
Sollte ich trotzdem darauf achten, die article-Properties als Routinen zu formulieren, um dem Interpreter Durcheinander zu ersparen?

Ja, das ist vielleicht besser. Auch wenn die wichtigsten Daten im Header schreibgeschützt sind, ist ein Beschreiben der Adressen ab Null in der Regel illegal.

Außerdem können unerwünschte Effekte auftreten. Wenn ein Artikel vierzehn Buchstaben oder mehr hat ("eine ganze Handvoll") kann es zum Beispiel passieren, dass das Manuskript ein- oder ausgeschatet wird oder dass die Schriftart wechselt. (Vgl. dazu The Z-Machine Standard: The format of the header)

Der eigentliche Fehler liegt in der Lib und sollte auch da behoben werden.

Christoph hat folgendes geschrieben:
Da zeigt sich halt der Unterschied zwischen Programmierer und Hobby-Coder :-)

Na, eigentlich bin ich auch nur Hobby-Coder. Zumindest verdiene ich nicht mein Geld mit Programmieren.
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail 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