Referenz in eigener Datei speichern
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
bmurrayBetreff: Referenz in eigener Datei speichern |
Di, Mai 08, 2018 12:03 Antworten mit Zitat |
|
---|---|---|
Hallo,
der Titel sagt es ja eigentlich schon, ich suche eine Möglichkeit, wie ich eine Referenz in einem eigenen Dateiformat speichern kann. Ich benötige dies zur Speicherung des Spielstandes. Ich habe ein kleines Programm erstellt, das dies verdeutlichen soll. In dem Programm werden vier Städte vom Type tStadt erstellt, die dann in einer Liste ("listestaedte") verlinkt werden. In einer Variable vom selben Type ("lieblingsstadt") wird auf eine dieser Städte gezeigt. Nun möchte ich in der Funktion "speichern" diese Variable, nun ja, eben speichern, um sie dann wieder laden zu können, damit sie wieder auf eine bestimmte Stadt zeigt. Meine Frage ist nun, kann man diese Variable überhaupt in einer eigenen Datei speichern, und wenn nein, was wäre dann der richtige Weg, um das gewünschte Ergebnis zu erhalten? Schon mal vielen Dank für Eure Hilfe, Gruß, bmurray Code: [AUSKLAPPEN] SuperStrict 'Wenn die Datei noch nicht erstellt wurde, das Laden erstmal aussetzen Local ladendurchfuehren:Int = 0 If ladendurchfuehren = 1 Then laden() Else 'Hier nun die vier Städte erstelleb tStadt.createStadt("Berlin", 3400000) tStadt.createStadt("München", 1300000) tStadt.createStadt("Frankfurt", 700000) tStadt.createStadt("Konstanz", 80000) End If 'Dies ist die Variable, die schließlich in "speichern" gespeichert werden soll, um dann in "laden" geladen zu werden Global lieblingsstadt:tStadt 'Hier einfach nur das Objekt "Frankfurt" mit der Variable verknüpfen If ladendurchfuehren = 0 Then For Local stadt:tStadt = EachIn tStadt.listeStaedte If stadt.name = "Frankfurt" Then lieblingsstadt = stadt End If Next End if 'Ausgeben For Local stadt:tStadt = EachIn tStadt.listestaedte Print stadt.name + " / " + stadt.einwohner Next If lieblingsstadt <> Null Then Print "Meine Lieblingsstadt ist " + lieblingsstadt.name EndIf speichern() Function speichern() Local i:Int Local datei:TStream = WriteFile("save.sav") OpenFile(datei) 'Anzahl der Städte speichern WriteInt(datei, tStadt.listeStaedte.Count()) 'Name und Einwohnerzahl speichern For Local stadt:tStadt = EachIn tStadt.listeStaedte WriteStringBB(datei, stadt.name) WriteInt(datei, stadt.einwohner) Next End Function Function laden() Local datei:TStream = OpenFile("save.sav") Local i:Int Local name:String Local einwohner:Int 'Hier alle Städte laden Local anzahlstaedte:Int = ReadInt(datei) For i = 1 To anzahlstaedte name = ReadStringBB(datei) einwohner = ReadInt(datei) tStadt.createStadt(name, einwohner) Next End Function Type tStadt Field name:String Field einwohner:Int Global listeStaedte:TList Function createStadt(name:String, einwohner:Int) If Not listeStaedte Then listeStaedte = New TList End If Local neuestadt:tstadt = New tStadt neuestadt.name = name neuestadt.einwohner = einwohner ListAddLast(listeStaedte, neuestadt) End Function End Type Function WriteStringBB(f:TStream, s:String) WriteInt f, s.Length WriteString f, s End Function Function ReadStringBB:String(f:TStream) Local n:Int = ReadInt(f) Return ReadString(f, n) End Function |
||
Mathias-Kwiatkowski |
Di, Mai 08, 2018 15:41 Antworten mit Zitat |
|
---|---|---|
Code: [AUSKLAPPEN] Function speichern()
Local datei:TStream = WriteFile("save.sav") If datei Then 'Anzahl der Städte speichern 'WriteInt(datei, tStadt.listeStaedte.Count()) '<- Brauchst du nicht 'Name und Einwohnerzahl speichern For Local stadt:tStadt = EachIn tStadt.listeStaedte datei.WriteLine(stadt.name) datei.WriteInt(stadt.einwohner) Next CloseFile datei EndIf End Function 'Das Laden Function Laden() Local Datei:TStream = ReadFile("save.sav") 'Wenn Datei Existiert If Datei 'Auslesen bis ende der datei While Not Eof(Datei) Local Stadt:String = Datei.ReadLine() Local Einwohner:Int = datei.ReadInt() 'In einer Classe (Typ) hinzufügen Wend 'In jedem Fall Schließen wenn geöffnet CloseFile Datei End If End Function |
||
Skype: Anarchie1984
http://projektworks.de/maxbase/ Icq - Erneuert am 21.08.2017 Yahoo - Erneuert am 21.08.2017 |
XeresModerator |
Di, Mai 08, 2018 20:38 Antworten mit Zitat |
|
---|---|---|
Vielleicht kann man das Reflection Modul benutzen, um kompliziertere Objektstrukturen zu serialisieren - könnte aber Komplizierter werden.
Ansonsten führt halt kein Weg daran vorbei, alle Objekte durch zu gehen, alle Werte zu schreiben und die nötigen Metadaten (welche Objekte sind in welcher Liste usw.) um den Zustand wiederherstellen zu können. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
bmurray |
Mi, Mai 09, 2018 8:37 Antworten mit Zitat |
|
---|---|---|
Vielen Dank für Eure Antworten. Ich habe fast schon befürchtet, dass man keine Zeiger speichern kann. Nur um nochmal klarzustellen (falls ich mich mißverständlich ausgedrückt habe): Ich habe eine Anzahl von Objekten erstellt, die in einer Liste aufgeführt werden. Nun habe ich eine Variable vom selben Type der Objekte, die auf ein Objekt dieser Liste zeigt. Diese Variable kann man in einem Spielstand NICHT speichern (bzw. ohne größeren Aufwand). Dies ist korrekt so? | ||
Thunder |
Mi, Mai 09, 2018 22:05 Antworten mit Zitat |
|
---|---|---|
Einen Zeiger speichern zu wollen ist schon Mal grundsätzlich eine schlechte Idee. Der Inhalt eines Zeigers ist eine Speicheradresse. Wenn du die abspeicherst und irgendwann wieder lädst, steht nicht fest, ob die Adresse überhaupt im virtuellen Speicher deines Programms existiert. Du kannst dir nicht wirklich aussuchen, an welche Adresse du welche Daten lädst.
Ich würde den Namen der Stadt speichern oder eine eindeutige ID Nummer und beim Laden musst du dann den Type von der Liste aller städte wieder zuordnen. Wie Xeres meinte, geht es möglicherweise auch über Reflection. Du müsstest aber ein Modul finden, das das für dich macht. |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
bmurray |
Mi, Mai 09, 2018 22:33 Antworten mit Zitat |
|
---|---|---|
Vielen Dank, dann weiß ich Bescheid! | ||
XeresModerator |
Do, Mai 10, 2018 0:01 Antworten mit Zitat |
|
---|---|---|
Vielleicht hilft dir das: Serialize/deserialize objects as JSON | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group