Forum moved to if-forum.org
Autor Nachricht
<  * Warning: grammar properties might not work correctly *[I6]
C++
BeitragVerfasst am: Mo, 21 März 2011 - 21:56  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 21.12.2009
Beiträge: 45
Wohnort: Kiel

Hallo an alle!

Oben stehende Fehlermeldung ziert seit Neuestem mein I6-Adventure und zwar ganz am Anfang, noch bevor die Initialise abgearbeitet wird. Ansonsten funktioniert meines Erachtens alles wie geplant.

Die Fehlermeldung steht in parserm.h und hat mit folgendem Code zu tun:
Code:
            #Ifdef TARGET_ZCODE;
            dict_start = HDR_DICTIONARY-->0;
            dict_entry_size = dict_start->(dict_start->0 + 1);
            dict_start = dict_start + dict_start->0 + 4;
            dict_end = dict_start + (dict_start - 2)-->0 * dict_entry_size;
            #Ifdef DEBUG;
            if (dict_start > 0 && dict_end < 0 &&
              ((-dict_start) - dict_end) % dict_entry_size == 0)
                print "** Warning: grammar properties might not work correctly **^";
            #Endif; ! DEBUG


Ich nur den Hauch einer Ahnung, was das alles heißen soll und überlege mir, die hässliche Meldung einfach zu tilgen, indem ich (ebenfalls in parserm.h) die Constante DEBUG auskommentiere. Kann ich dabei was kaputtmachen?

A propos DEBUG: Wenn ich in den Compiler-Angaben den Debug-Modus aktiviere, fehlt diese Fehlermeldung. Gibt es Einschränkungen in der Spielbarkeit, wenn das Spiel in diesem Modus kompiliert ist?

Schöne Grüße vom Rand des Wahnsinns...

Christof
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ChristianB
BeitragVerfasst am: Mo, 21 März 2011 - 23:30  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg

C++ hat folgendes geschrieben:
Oben stehende Fehlermeldung ziert seit Neuestem mein I6-Adventure und zwar ganz am Anfang, noch bevor die Initialise abgearbeitet wird.

Ja, ganz zu Beginn des Programmlaufs (Z-Code) wird die Integrität des Z-Code-Wörterbuchs geprüft, d.h. es wird geschaut, wie viele Einträge im Lexikon es gibt und geprüft, ob die Anzahl der Einträge multipliziert mit der Länge eines solchen Eintrags mit der tatsächlichen Größe des Wörterbuch-Speicherbereichs übereinstimmt. Das scheint bei Deinem Programm nicht mehr der Fall zu sein; es ist also möglich, dass manche Vokabeln nicht mehr verstanden werden. Wie dieser Fehler zustande kommt, kann ich so nicht sagen; vielleicht nimmst Du einfach mal die letzten Änderungen Stück für Stück zurück.

Wahrscheinlich entsteht der Fehler bei einer Vokabeldefinition (Objektsynonym, Kommando). Hast Du vielleicht mal eine Vokabel, die nur aus einem Zeichen bestehen soll, benutzt? Also statt 'z//' nur einfach 'z' geschrieben, oder sowas? 'z' wäre nämlich keine Adresse im Wörterbuch (eine Vokabel) sondern ein einzelnes Zeichen (ZSCII). Eine Vokabel, die nur aus einem Zeichen besteht, muss in der Form 'x//' (zwei Schrägstriche nach dem Zeichen) angegeben werden, damit der Compiler schnallt, dass eine Adresse gemeint ist. Denkbar wäre auch, dass Du statt 'vokabel' versehentlich irgendwo "vokabel" geschrieben hast (obwohl der Parser da eigentlich ein Auge zudrückt).

Na ja, alles nur Vermutungen.

C++ hat folgendes geschrieben:
Kann ich dabei was kaputtmachen?

Beim Herumschreiben in der Lib ist die Wahrscheinlichkeit, dass irgendwas kaputtgefummelt wird, sehr hoch.

C++ hat folgendes geschrieben:
A propos DEBUG: Wenn ich in den Compiler-Angaben den Debug-Modus aktiviere, fehlt diese Fehlermeldung. Gibt es Einschränkungen in der Spielbarkeit, wenn das Spiel in diesem Modus kompiliert ist?

Das ist seltsam, denn laut Quellcode werden die Überprüfung und die Fehlermeldung nur compiliert, wenn DEBUG aktiviert ist, im Release-Modus (also der Nicht-DEBUG-Modud) dürfte die Meldung gar nicht erscheinen. Der DEBUG-Modus erlaubt es den Testern, bestimmte Debug-Funktionen zu benutzen, die in einem veröffentlichten Spiel besser nicht zur Verfügung stehen sollten. So könnte der Spieler z.B. ganz leicht per >TREE sehen, wo sich alle Objekte befinden.

Grüße,
Christian
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Martin
BeitragVerfasst am: Di, 22 März 2011 - 20:11  Antworten mit Zitat
Experte
Experte


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

Die Meldung kommt wohl, wenn das Wörterbuch des Z-Codes über die 15-Bit-Grenze geht. Die Zahlen im Z-Code führen ein Zwitterleben: Sie sind vorzeichenbehaftet (signed), wenn es um arithmetische Operationen und Vergleiche geht und sie haben kein Vorzeichen, wenn sie als Adressen interpretiert werden. So ist

32000 + 1000 == -32536

aber (32000)->1000 liest korrekt das Byte an Stelle 33000 im Speicher.

Was die Überprüfung jedoch soll, weiß ich nicht genau. Die Größe eines Eintrags ist 9: 6 Bytes, um 9 Zeichen abzuspeichern plus drei Bytes Grammatikflaggen. Die Bedingung oben ist nur dann wahr, wenn ein Eintrag genau auf der 15-Bit-Grenze liegt. Was dann passieren soll, weiß ich nicht.

Da von "grammar properties" gesprochen wird, vermute ich, dass die Wörter richtig erkannt werden aber die Zusatzflaggen nicht. Das würde eventuell Wörter hinten im alphabetisch sortierten Wörterbuch betreffen. Wenn Du
Code:
Verb 'zzz' * -> Wait;

definierst und das Spiel 'zzz' nicht als Verb erkennt, ist was faul. (Das scheint mir eine sichere Definition, selbst für die Release-Version.)

(Ich kann mir vorstellen, dass die Warnung für ältere Interpreter gilt. Die Gleichung, die ich oben hingeschrieben habe, muss nicht unbedingt wahr sein. Der Z-Maschinen-Standard beschreibt nicht, was passieren soll, wenn arithmetische Operationen überlaufen, d.h. wenn sie die Grenzen der vorzeichenbehafteten 16-Bit-Zahlen sprengen. Das empfohlene Verhalten ist ein Überlauf, bei dem hohe Bits einfach abgeschnitten werden, so wie beim Kilometerzähler. Aber streng genommen ist so eine Operation "undefined behaviour", und als C++-Freund weißt Du ja, was das heißt ...)

Weshalb die Meldung ohne DEBUG kommt, verstehe ich genausowenig wie Christian: Das Ifdef spricht ja klare Worte. Und eine kurze Suche zeigt, dass der Fehler auch nur im Debug-Modus auftritt. Und dass er in I7 gefixt ist.

Weshalb DEBUG die Meldung verschwinden lässt, kann ich mir denken: Das Wörterbuch verschiebt sich nach hinten, weil der Debug-Modus Felder definiert, die in der Datei weiter vorne kommen. So könntest Du aber auch die Meldung wegbekommen: Definiere ein Dummy-Feld mit bis zu neun Einträgen:

Code:
Array dict_dummy_padding -> 3;

Übrigens: Mit z5 und z8 hat das Ganze nichts zu tun. Das Wörterbuch ist komplett im unteren, mit 16-Bit adressierbaren Speicherbereich. Der Unterschied zwischen z5 und z8 ist aber die Adressierung des "High Memory", also alles, was nach dem Wörterbuch kommt bis zum Dateiende.
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
C++
BeitragVerfasst am: Fr, 25 März 2011 - 17:44  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 21.12.2009
Beiträge: 45
Wohnort: Kiel

Hallo und vielen Dank euch beiden!

Wie gut, dass ich die Finger vom Parser gelassen hab, denn es war tatsächlich eine Verbdefinition. Ich habe eine HilfMirSub definiert, die auch funzt. Die Definition


Code:

Verb 'hilf'
      *             -> HilfMir
;


führt aber zum genannten Problem. Eine kleine Erweiterung war die Lösung:

Code:

Verb 'hilf'
      *             -> HilfMir
      * 'zu' noun   -> HilfMir
;


Verstehen muss ich das nicht. Und noch einmal auftreten wird's auch nicht, ich hab die 140 Verben leider voll (und buddeln und sch*** schon ersetzt...).

Nochmals danke!

Christof

PS:
Zitat:

Und eine kurze Suche zeigt, dass der Fehler auch nur im Debug-Modus auftritt.

Hups, auf Google und die internationale Community bin ich tatsächlich gar nicht gekommen, weil Hilfe immer so schnell hier im Forum kam.

PPS:
Zitat:

und als C++-Freund weißt Du ja, was das heißt ...

... erwischt! Der Nick ist reine Angeberei, ich kann höchstens ein bisschen Java-Script und Visual Basic, aber das fängt nun mal nicht mit C an.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ChristianB
BeitragVerfasst am: Fr, 25 März 2011 - 18:43  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg

C++ hat folgendes geschrieben:
... ich hab die 140 Verben leider voll ...

Die Anzahl der Verben lässt sich erhöhen, indem Du ganz am Anfang Deines Codes Folgendes schreibst:

Code:
!% $MAX_VERBS=220

Das schafft Platz für 220 Verben. (Stichwort: "Memory Settings").

http://www.firthworks.com/roger/informfaq/pp.html#14

Grüße,
Christian
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
C++
BeitragVerfasst am: Fr, 25 März 2011 - 21:35  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 21.12.2009
Beiträge: 45
Wohnort: Kiel

Wow, was für ein Tipp! Die Compiler-Kapitel im DM4 habe ich bisher schmählich missachtet, weil die mir doch etwas zu technisch waren. (Selbst schuld...) Das birgt ja ungeahnte Möglichkeiten - vielen Dank!

(Ich habe den Befehl ohne Ausrufezeichen in meine Compiler-Angaben geschrieben, ansonsten hat der Compiler gemeckert.)

C.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
C++
BeitragVerfasst am: So, 3 Apr 2011 - 5:35  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 21.12.2009
Beiträge: 45
Wohnort: Kiel

Hallo an alle, die das Problem mit I6 auch haben:

Bei mir ist die Meldung noch mal erschienen, ohne dass sie etwasmit den Verben zu tun hatte, sondern mit den individual props, von denen ich offenbar zu viele gleichnamige definiert hatte.

Ich hatte das DM4 so verstanden, dass das geht. Gleichnamig waren sie auch nur, weil sie dasselbe leisten sollten und ich nicht für jede der Aktionen eine globale Variable einführen wollte.

Ich habe nun zwei individual pros, die ich häufig verwendet habe, mit "Property" im Header definiert und seitdem läuft das Programm zumindest technisch ohne erkennbare Fehler...

Schöne Grüße,

Christof
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Martin
BeitragVerfasst am: Di, 29 Mai 2012 - 7:49  Antworten mit Zitat
Experte
Experte


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

Vermutlich ist es nicht mehr wichtig, aber der Vollständigkeit halber: Mir ist am Wochenende beim Aufräumen das DM4 in die Hände und dabei fast auseinandergefallen. Ich glaube, ich weiß jetzt, weswegen die Fehlermeldung oben kommt.

Mit der Eigenschaft grammar kann man für manche Gesprächspartner eigene Satzmuster definieren, Abschnitt 18 ist voll von Bordcomputern und Replikatoren, denen man Befehle erteilen kann. Diese Eigenschaft kann false, true, ein 'verb' als Wörterbucheintrag oder -'verb', also der negative Wert eines Wörterbucheintrags sein.

Wörterbucheinträge sind nicht vorzeichenbehaftete ganze Zahlen, die eine Adresse im Bereich von 0 bis 65535 angeben. Die Negation mit - betrachtet diese Adresse allerdings als vorzeichenbehaftete Zahlen. Adressen von 0 bis 32767 bleiben, Adressen von 32768 bis 65535 werden als -32768 bis -1 betrachtet.

Je nachdem, wie viele Objekte und Felder definiert sind, liegt das Wörterbuch komplett im Bereich der positiven oder negativen Zahlen oder es liegt im Übergangsbereich. Aber selbst im Übergangsbereich kann man feststellen, ob das Verb positiv oder negativ angegeben wurde, weil die Adresse

verb = dict_start + k * dict_entry_size

sein muss. Die dict_entry_size ist im Z-Code 9, 6 Bytes für 9 Z-Zeichen plus drei Bytes mit Flaggen.

Es gibt einen Sonderfall: Wenn es ein Wort an Adresse 32768 gibt, kann man positive und negative Werte nicht mehr unterscheiden, zum Beispiel:

Code:

    Wort        ...     'gehe'  'gelb' 'geld'   'gerd'  'gib'
    Adresse     ...     32752   32759   32768   32771   32790   ...
    ganze Zahl  ...     32752   32759  -32768  -32759  -32752   ...


Ist der zurückgegebene Wert nun 'gehe' oder 'gib'? Die Lib kann es nicht eindeutig feststellen und gibt die Warnung aus. Ein Sonderfall im Sonderfall ist die Zahl -32768, die negiert ebenfalls -32768 ist, weil man die positive Zahl 32768 in der Z-Maschine nicht als Zahl ausdrücken kann.

Die Warnung ist unschön, aber ohne Belang, wenn man grammar nicht verwendet, was glaube ich selten gemacht wird. I7 verwendet es nicht, lässt es aber als Einhänger für I6-Programmierer offen.

In Nicht-Debug-Builds sollte die Warnung verschwinden. Wenn das Spiel einmal groß genug ist, ist es mehr oder weniger Zufall, ob der Sonderfall eintritt. Alle neu eingefügten Objekte, Property-Einträge und Felder verschieben das Wörterbuch und die Meldung tritt sporadisch auf.
_________________
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