Referenz in eigener Datei speichern

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

bmurray

Betreff: Referenz in eigener Datei speichern

BeitragDi, Mai 08, 2018 12:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Mai 08, 2018 15:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Xeres

Moderator

BeitragDi, Mai 08, 2018 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

bmurray

BeitragMi, Mai 09, 2018 8:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Mai 09, 2018 22:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Mai 09, 2018 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank, dann weiß ich Bescheid!

Xeres

Moderator

BeitragDo, Mai 10, 2018 0:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group