Geschrieben um 19:35 am 11.07.2004 | Zitat | Editieren | Löschen | |
Mitglied Bachelor Gumby Beiträge: 60 | Hi! Ich stelle mal meine Frage wieder kurz und schmerzlos: Wie kann man Inform dazu bringen, das Ergebnis von read buffer parse (also das, was der Spieler dann eingibt) in einer Variable zu speichern? Oder geh ich die Sache völlig falsch an? Bin natürlich wie immer über jede Hilfe dankbar! |
Geschrieben um 20:33 am 11.07.2004 | Zitat | Editieren | Löschen | |
Mitglied Prof Gumby Beiträge: 634 | Zitat:
Kann sein, ich weiß jedoch nicht genau, was du willst. Mit der Anweisung read buffer parse erhältst du das "Ergebnis", also den Wortlaut der Eingabe ja, und zwar im Byte-Feld buffer im in Abschnitt 2.5 im DM4 angegebenen Format: Das erste Byte (buffer->0) gibt die Maximal einzulesenden Zeichen an, es sollte also vor dem Aufruf von read auf einen passenden Wert gesetzt werden. Das zweite Byte, buffer->1, enthält die Anzahl der tatsächlich eingegebenen Zeichen. Ab buffer->2 stehen dann diese Zeichen im ZSCII-Format, sie können mit der Druckregel (char) ausgegeben werden:
Die Eingabe von read wird immer in Kleinbuchstaben konvertiert, so dass Annahmen über Großschreibung (erster Buchstabe oder vorhergehendes Zeichen ein Leerschritt) in diesen Code eingebaut werden müssten. In der Form read buffer parse macht die Anweisung read noch etwas: Sie teilt die Eingabe in Wörter auf und versucht diese Wörter im internen Wörterbuch zu finden und legt diese Information auf dem Feld parse ab, wieder in einem etwas ungewöhnlichen Format, das in §2.5 beschrieben wird. Siehe hierzu das Beispiel am Ende des Abschnitts, bei dem nur die Wörter 'mary', 'had', 'a', 'little' und 'lamb' verstanden werden und das eine Kurzanalyse der Spielereingabe durchführt. (Die rudimentäre Satzanalyse wird weggelassen, wenn der zweite parameter von read null ist.) Das Ergebnis in einer Variable abzulegen, geht nicht. Folgendes
bitte nicht ausprobieren! Strings in Inform sind nicht wie Strings in anderen Programmiersprachen, weswegen es auch recht kompliziert ist, Teilstrings zu extrahieren, den ersten Buchstaben groß zu schreiben, usw. Schlimmer noch, Inform kennt zwei String-Konzepte, die beide String heißen. Die am häufigsten vorkommende Variante des Strings sind Texte in Gänsefüßchen, zum Beispiel:
All diese Texte gehören zur Metaklasse String, die Variablen enthalten eine packed address, eine Adresse im Hochspeicher des z-Codes. An dieser Adresse wird der String in komprimierter Form abgelegt, man kann auf diesen String in der Regel nur auf eine Art zugreifen: Mit der Druckregel (string). Wenn eine message an eine Objekteigenschaft gesandt wird, die einen String enthält, kann Inform die Metaklasse herausfinden und wandelt dann diese message in ein print (string) um. (Der Hochspeicher ist der einzige Teil des z-Codes, der 64k überschreiten kann. Damit man auf diese Adressen mit 16-Bit-Zahlen zugreifen kann, ist die packed address nicht die tatsächliche Adresse, sie muss mit vier multipliziert werden, um die tatsächliche Adresse zu erhalten. Die Adressierung von Routinen funktioniert genauso, eine z5-Datei kann bis zu 256k = 4*64k groß werden, alles, was über der 64k-Marke liegt sind Routinen und Strings.) Da der String erstens komprimiert, also codiert, ist und zweitens außerhalb des direkt zugreifbaren Speichers liegt, kann man etwas wie das folgende nicht machen:
Die Strings in doppelten Anführungszeichen sind statisch! (Ausnahme siehe unten...) Die zweite Art von Strings, die nur in besonderen Fällen gebraucht wird, ist ein Byte-Feld, das eine Folge von Zeichen im ZSCII-Format enthält. Wie genau die Länge dieses Strings bezeichnet wird, muss der Autor selbst festlegen, es gibt mehrere Möglichkeiten, einen String mit n Zeichen im String str abzulegen:
Ich habe oben gesagt, dass Strings in doppelten Anführungszeichen statisch sind. Und ich habe gesagt, dass es eine Ausnahme gibt: Arrays, die bei ihrer Definition nur einen Eintrag, nämlich einen String in Gänsefüßchen, haben, werden als String-Arrays mit den passenden Zeichen als Inhalt definiert. Folgende Definitionen sind gleichwertig:
Ich habe auch gesagt, dass man statische Strings nicht manipulieren kann. Stimmt. Mann kann sie aber in ein Hilfsfeld ausgeben lassen, und sie dann manipulieren:
Kompliziert? Ja und Nein. Man muss nur wissen, wann man es mit welchem String zu tun hat. Wenn (metaclass(x)==String), dann kann man ihn mit (string) x ausgeben. Bei Eingaben, die natürlich dynamisch und Zeichen für Zeichen abrufbar sein müssen, muss man die Texte auf Feldern ablegen. Die interne Verwendung des Bezeichners "String" und die von verschiedenen Opcodes produzierten Formate für Feldinhalte tragen allerdings zur Verwirrung bei. |
Geschrieben um 00:16 am 12.07.2004 | Zitat | Editieren | Löschen | |
Mitglied Bachelor Gumby Beiträge: 60 | Ah, danke!
Das war glaub ich im Wesentlichen das, was ich gesucht habe. Wenn ich das richtig verstehe, kann man die Variable c im oberen Beispiel, falls sie als Global deklariert wird, auch im übrigen Spiel verwenden, oder? Praktisch so:
Unschön? Der Spielername würde immer klein ausgegeben, aber das ist erstmal auch unwichtig. Das nächste Fragezeichen ist sicher nicht weit entfernt, aber herzlichen Dank für solch eine ausführliche Antwort! EDIT: Das funktioniert natürlich nicht, was ich jetzt auch gemerkt habe, weil c ja in einer Schleife steht und am Ende nur den Wert des letzten eingegebenen Zeichens annimmt. Heißt das, für eine vollständige Ausgabe müsste jedes Mal wieder die Schleife durchlaufen lassen werden? |
Geschrieben um 00:34 am 12.07.2004 | Zitat | Editieren | Löschen | |
Mitglied Bachelor Gumby Beiträge: 60 |
Das ist schon fast das, was ich haben wollte. ^^ Um mich an Groß- und Kleinschreibung zu versuchen bin ich heute aber schon zu müde. |
Geschrieben um 12:51 am 21.07.2004 | Zitat | Editieren | Löschen | |
Mitglied Dr Gumby Beiträge: 181 | Zitat:
Hi, ich weiss nicht ob es noch aktuell ist, aber du könntest das so lösen indem du den char-Wert des ersten Buchstabens (also den dritten Eintrag des Arrays) um 32 verkleinerst, so erhälst du automatisch den großen Buchstaben:
|
Geschrieben um 13:26 am 21.07.2004 | Zitat | Editieren | Löschen | |
Mitglied Prof Gumby Beiträge: 634 | Zitat:
Eine Variante, die alle Buchstaben groß schreibt, wenn sie nach einem Zeichen stehen, die kein Buchstabe sind, findet man in in Roger Firths Inform FAQ. So werden "Paula-Henriette Meier", "George W. Bush", "Bad Oeynhausen", "M'Gladbach" usw. richtig ausgegeben. Die Anpassung auf die deutschen Umlaute könnte wie folgt aussehen:
Die in Rogers Beispiel verwendete Routine UpperCase ist in der englischen Lib 6/11 definiert und behandelt alle westeuropäischen Zeichen (ISO 8859-1) korrekt, die Routine Gross ist nur eine abgespeckte Version, genau wie ist_dt_Zeichen. |
Geschrieben um 13:04 am 22.07.2004 | Zitat | Editieren | Löschen | |
Mitglied Bachelor Gumby Beiträge: 60 | Hm, ich hatte es so ähnlich gelöst wie in Kris' Beispiel, aber war dann natürlich auf ein Wort (im Fall eines Spielernamens) beschränkt geblieben. Hatte mich damit auch vorerst begnügt, aber wenn ich Martins Beispiel so durchlese... wow. ^^ Das eröffnet ja ungeahnte Möglichkeiten. Danke! |