Autor |
Nachricht |
< ScopeWithin(ALLE) ?? |
|
Verfasst am:
Mo, 24 Jan 2005 - 12:05
|
|
|
Kompassleser

Anmeldungsdatum: 21.02.2004
Beiträge: 198
Wohnort: Rheinmain
|
|
Ich habe eine Frage zu ScopeWithin:
Bei:
Code: | [ AskTopicsScope;
switch (scope_stage) {
1: rfalse;
2: ScopeWithin(AskTopics); rtrue;
... |
Müssen ja alle Topics als Kinder von AskTopics angelegt werden.
Gibt es eine Möglichkeit, ALLE Objekte mit einzubeziehen?
So müsste ein sowieso schon bestehenedes Objekt nicht nocheinmal angelegt werden sondern nur die, die noch nicht als Objekte existieren.
Es muß doch soetwas wie eine "Mutter" aller Objekte geben (gibt es nicht, klar, weil es auch Waisen gibt).
Aber was ich meine, sollen ähnlich wie bei "ObjectLoop (o)" eben alle Objekte berücksichtigt werden.
Der Versuch mit "ScopeWithin()" schlug leider fehl.
Dank und Gruß
Kris |
|
|
|
 |
|
Verfasst am:
Mo, 24 Jan 2005 - 12:21
|
|
|
Experte

Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München
|
|
Wieso machst du es nicht so, wie es in Aufgabe 99 beschrieben wird? Du bist ja nicht unbedingt an ScopeWithin gebunden, du kannst ja auch PlaceInScope verwenden:
Code: |
[ AskTopicsScope i;
if (scope_stage == 1) rfalse;
if (scope_stage == 2) {
objectloop (i ofclass Object) PlaceInScope(i);
rtrue;
}
"Du fragst Sachen!";
];
|
Probier das mal. Wenn das klappt, könntest du die Objekte, die man erfgaren kann, einschränken, indem du mögliche Objekte mit einem neu zu definierenden Attribut kennzeichnest:
Code: |
objectloop (i ofclass Object && i has validtopic)
PlaceInScope(i);
|
Das ist vielleicht zuviel des Guten, aber ein großer Scope bedeutet auch viel Arbeit für den Parser, so dass diese Option vielleicht nützlich ist, wenn das Spiel durch den alles umfassenden Scope arg langsam wird.
Vielleicht wird die Analyse aber auch bereits durch den globalen objectloop langsam, dann könntest du vielleicht ein Feld mit gültigen Topics schreiben, die dann dem Scope hinzugefügt werden:
Code: |
Array validtopics table Napoleon Descartes Jacques_Chirac;
[ AskTopicsScope i;
if (scope_stage == 1) rfalse;
if (scope_stage == 2) {
for (i=1 : i<=validtopics-->0 : i++)
PlaceInScope(validtopics-->i);
rtrue;
}
"Du fragst Sachen!";
];
|
Auf diese Weise behalten die Objekte ihren Platz im Baum, können aber trotzdem einigermaßen zügig in den Scope gebracht werden.
Kris hat folgendes geschrieben: | Der Versuch mit "ScopeWithin()" schlug leider fehl. |
Das ist klar. Du versuchst hier, die Kinder von nichts zu finden und das ist laut z-Maschinen-Spezifikation etwas ganz, ganz Böses... _________________ Every silver lining has a cloud. |
|
|
|
 |
|
Verfasst am:
Mo, 24 Jan 2005 - 15:05
|
|
|
Kompassleser

Anmeldungsdatum: 21.02.2004
Beiträge: 198
Wohnort: Rheinmain
|
|
Martin hat folgendes geschrieben: | Wieso machst du es nicht so, wie es in Aufgabe 99 beschrieben wird? |
Weil ich dummerweise die Aufgaben manchmal überlese obwohl ich dort immer wieder Antworten auf meine Fragen bekommen habe ;-)
Jedenfalls habe ich das eben mal ausprobiert und es funktioniert.
Martin hat folgendes geschrieben: | Das ist vielleicht zuviel des Guten, aber ein großer Scope bedeutet auch viel Arbeit für den Parser, so dass diese Option vielleicht nützlich ist, wenn das Spiel durch den alles umfassenden Scope arg langsam wird. |
Also langsam ist es nicht, ich bin bei ca. 250 Objekten, aber auch noch nicht fertig. Kann aber auch nicht testen, wie lange es auf einem langsameren System dauert, da PentiumII das langsamste ist, was ich zu Hause habe und ich nicht glaube, hier schon einen Unterschied zu bemerken.
Ich werde es jetzt jedenfalls erstmal so belassen.
Vielen Dank!
Kris |
|
|
|
 |
|
Verfasst am:
Mo, 24 Jan 2005 - 16:12
|
|
|
Experte

Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München
|
|
Kris hat folgendes geschrieben: | Weil ich dummerweise die Aufgaben manchmal überlese obwohl ich dort immer wieder Antworten auf meine Fragen bekommen habe ;-) |
Die Aufgaben gehören im DM4 auf jeden Fall mit zur Lektüre. Manche Dinge, wenn auch nur selten benutzte, werden nur in Aufgaben angesprochen, wie zum Beispiel in den Aufgaben 65 (lookmode) und 91 (NounDomain). Außerdem sind die Aufgaben sehr gute Beispiele für elegantes Coden in Inform.
PlaceInScope(obj) wird aber auf Seite 234 ohne Zusammenhang zu Aufgaben beschrieben :->
Kris hat folgendes geschrieben: | Jedenfalls habe ich das eben mal ausprobiert und es funktioniert. |
Fein. (Hatte es nämlich nicht getestet.) _________________ Every silver lining has a cloud. |
|
|
|
 |
|