Autor |
Nachricht |
< <Answer 'text' Person> funktioniert nicht |
|
Verfasst am:
Di, 10 März 2009 - 3:04
|
|
|
Experte
Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg
|
|
Hilfe! Ich versteh's nicht: Ich habe den Action-Aufruf <Answer 'text' Person> in meinem letzten Spiel problemlos nutzen können. Jetzt bekomme ich bei einem neuen Projekt plötzlich vom Interpreter (Windows Frotz) die Fehlermeldung:
@Attempt to address illegal object 15664. This is normally fatal.
Das Problem ist deform-unabhängig -- mit der englischen Library passiert das gleiche. Hier mal ein völlg jungfräuliches Test-Beispiel, in dem der Fehler auch auftaucht:
Code: | !% +include_path=.\,..\..\Lib\Deform
Constant Story "TITEL";
Constant Headline "^Ein Test^";
Include "Parser";
Include "VerbLib";
Object Testraum "Testraum"
with
description "Hier wird getestet.",
has light;
Object Kalle "Kalle" Testraum
with name 'kalle',
has male animate proper;
[ Initialise;
location = Testraum;
<Answer 'text' Kalle>;
!<Ask Kalle 'text'>;
];
Include "GermanG"; |
<Ask Kalle 'text'> funktioniert ohne Probleme. Nur mit ##Answer zickt Inform rum. Was ist da los? Kann das jemand reproduzieren?
Grüße aus der Nachtschicht,
Christian |
|
|
|
|
|
Verfasst am:
Di, 10 März 2009 - 9:29
|
|
|
Experte
Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München
|
|
Aaaargh, die unseligen Konversationsroutinen von Inform, die es ja leider auch bis I7 geschafft haben. Der Fehler tritt in RunRoutines auf, das leider nicht prüft, ob das erste Argument auch ein Objekt ist. Innerhalb von BeforeRoutines und ähnlichen Routinen wird zwar vor dem Aufruf geprüft, ob das Argument größer als 0 ist, aber nicht, ob es sicht tatsächlich um ein Objekt handelt.
Workaround: In der Routine RunRoutines in Zeile 5301 in parserm.h eine zusätzliche Abfrage einfügen:
Code: | [ RunRoutines obj prop;
if (~~(obj ofclass Object)) rfalse; ! Nur Objekte, bitte!
if (obj == thedark && prop ~= initial or short_name or description) obj = real_location;
if (obj.&prop == 0 && prop >= INDIV_PROP_START) rfalse;
return obj.prop();
]; |
Dann läuft's und der Operator .& wird nicht auf das illegale Objekt 'text' angewandt.
Die Aktionen ##Order, ##Ask, ##Tell und ##Answer sind eh ein rechter Krampf, genauso wie die Krücken inp1 und inp2 und das [Topic]-Token.
(Wieso bei ##Consult das Thema nur über consult_from und consult_word abfragbar ist, aber bei ##Ask und ##Tell als second und bei ##Answer als noun, ist mir schleierhaft. Und an vielen Stellen im Parser wird explizit abgefragt, ob die Aktion eine dieser drei Konversationsroutinen ist, und dann wird irgendetwas überhaupt nicht Nachvollziehbares gemacht: "say yes to man" ist <man, ##yes>, aber "say blrfgz to man" ist <##Answer 'blrfgz' man> und zig andere solcher Dinge. Naja.) _________________ Every silver lining has a cloud. |
|
|
|
|
|
Verfasst am:
Di, 10 März 2009 - 11:35
|
|
|
Experte
Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg
|
|
Martin hat folgendes geschrieben: | Aaaargh |
Du sagst es.
Deine Änderung an RunRoutines spart mir eine Menge Zeit, da ich bestehenden Code verwenden möchte, und jetzt nicht alles umschreiben muss -- Danke! |
|
|
|
|
|
|
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.
|
|