Autor |
Nachricht |
< * Warning: grammar properties might not work correctly *[I6] |
|
Verfasst am:
Mo, 21 März 2011 - 21:56
|
|
|
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 |
|
|
|
|
|
Verfasst am:
Mo, 21 März 2011 - 23:30
|
|
|
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 |
|
|
|
|
|
Verfasst am:
Di, 22 März 2011 - 20:11
|
|
|
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. |
|
|
|
|
|
Verfasst am:
Fr, 25 März 2011 - 17:44
|
|
|
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. |
|
|
|
|
|
Verfasst am:
Fr, 25 März 2011 - 18:43
|
|
|
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:
Das schafft Platz für 220 Verben. (Stichwort: "Memory Settings").
http://www.firthworks.com/roger/informfaq/pp.html#14
Grüße,
Christian |
|
|
|
|
|
Verfasst am:
Fr, 25 März 2011 - 21:35
|
|
|
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. |
|
|
|
|
|
Verfasst am:
So, 3 Apr 2011 - 5:35
|
|
|
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 |
|
|
|
|
|
Verfasst am:
Di, 29 Mai 2012 - 7:49
|
|
|
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. |
|
|
|
|
|
|
Alle Zeiten sind GMT + 1 Stunde (MEZ) |
|
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.
|
|