Seite 1 von 1

[gelöst]Strukturen speichen und laden

Verfasst: 22.07.2018 20:59
von Qnode
Hey,

bin neu hier. Nur ganz kurz zu mir: bin Hobbyprogrammierer und nicht mehr ganz der Jüngste (meine ersten Erfahrungen mit Basic machte ich als Schüler auf dem Sinclair ZX81). Macht Spaß mal wieder ohne OOP-Overhead zu programmieren :mrgreen:
Ich versuche mich in PureBasic einzufummeln und kämpfe gerade damit, Daten zu sichern und wieder hervorzuholen. Habe mir dazu folgenden Code gebastelt. Das erste Programm speichert Daten ab:

Code: Alles auswählen

Structure Goodie
  Menge.s
  Bezeichnung.s{30}
  MussGekuehltWerden.b
EndStructure

Structure MaidImWald
  Name.s
  List Korb.Goodie()
EndStructure

BraveEnkelin.MaidImWald

BraveEnkelin\Name = "Rotkäppchen"

AddElement(BraveEnkelin\Korb())
BraveEnkelin\Korb()\Bezeichnung = "Wein"
BraveEnkelin\Korb()\Menge = "Eine Flasche"
BraveEnkelin\Korb()\MussGekuehltWerden = #False

AddElement(BraveEnkelin\Korb())
BraveEnkelin\Korb()\Bezeichnung = "Käse"
BraveEnkelin\Korb()\Menge = "Eine gutes Stück"
BraveEnkelin\Korb()\MussGekuehltWerden = #True

AddElement(BraveEnkelin\Korb())
BraveEnkelin\Korb()\Bezeichnung = "Apfel"
BraveEnkelin\Korb()\Menge = "Einen"
BraveEnkelin\Korb()\MussGekuehltWerden = #False

Debug BraveEnkelin\Name + " geht durch den dunklen Wald"
Debug "Sie hat etwas Feines für die Großmutter dabei:"

Kuehlung.b = #False
ForEach BraveEnkelin\Korb()
  Debug BraveEnkelin\Korb()\Menge + " " +BraveEnkelin\Korb()\Bezeichnung
  If BraveEnkelin\Korb()\MussGekuehltWerden
    Kuehlung = #True
  EndIf
Next

If Kuehlung
  Debug "Statt des Körbchens nimmt sie heute die Kühlbox"
EndIf

;Rotkäppchen sichern... falls ihr der böse Wolf begegnet

#ROTKAEPPCHENS_DATEI = 1
If CreateFile(#ROTKAEPPCHENS_DATEI,"Rotkäppchens_Haus.Dat")
  AnzahlGoodies.i = ListSize(BraveEnkelin\Korb())
  WriteString(#ROTKAEPPCHENS_DATEI,BraveEnkelin\Name)
  WriteInteger(#ROTKAEPPCHENS_DATEI, AnzahlGoodies)
  ForEach BraveEnkelin\Korb()
    WriteString(#ROTKAEPPCHENS_DATEI, BraveEnkelin\Korb()\Bezeichnung)
    WriteString(#ROTKAEPPCHENS_DATEI, BraveEnkelin\Korb()\Menge)
    WriteByte(#ROTKAEPPCHENS_DATEI,   BraveEnkelin\Korb()\MussGekuehltWerden)
  Next
  CloseFile(#ROTKAEPPCHENS_DATEI)
EndIf

Das scheint soweit erstmal zu funktionieren. Dann habe ich mir ein Programm gebastelt, um Rotkäppchen wieder von der Festplatte zu holen:

Code: Alles auswählen

Structure Goodie
  Menge.s
  Bezeichnung.s{30}
  MussGekuehltWerden.b
EndStructure

Structure MaidImWald
  Name.s
  List Korb.Goodie()
EndStructure

BraveEnkelin.MaidImWald

;Nun die Maid aus dem Wald zurückholen!

#ROTKAEPPCHENS_DATEI = 1
AnzahlGoodies.i
i.i = 1

If ReadFile(#ROTKAEPPCHENS_DATEI, "Rotkäppchens_Haus.Dat")
  BraveEnkelin\Name = ReadString(#ROTKAEPPCHENS_DATEI)
  AnzahlGoodies = ReadInteger(#ROTKAEPPCHENS_DATEI)
  For i = 1 To AnzahlGoodies
    AddElement(BraveEnkelin\Korb())
    With BraveEnkelin\Korb()
      \Bezeichnung = ReadString(#ROTKAEPPCHENS_DATEI)
      \Menge = ReadString(#ROTKAEPPCHENS_DATEI)
      \MussGekuehltWerden = ReadByte(#ROTKAEPPCHENS_DATEI)
    EndWith
  Next
EndIf

Debug "Name: " + BraveEnkelin\Name
ForEach BraveEnkelin\Korb()
  Debug "Goodie: " + BraveEnkelin\Korb()\Menge + " " + BraveEnkelin\Korb()\Bezeichnung
  If BraveEnkelin\Korb()\MussGekuehltWerden
    Debug "...muss gekühlt werden"
  EndIf 
Next

Das klappt nicht wie gewünscht. Der Integer AnzahlGoodies enthält laut Variablenüberwachung irgend einen wirren Riesenwert. Könntet Ihr euch den Code mal ansehen und mir sagen, was ich falsch gemacht habe. Bin auch dankbar und überhaupt nicht böse für Hinweise, wo ich hässlich, umständlich oder sonstwie unglücklich gecodet habe.


Liebe Grüße aus Berlin
Qnode

__________________________________________________
Quote Tags>Code Tags
22.07.2018
RSBasic

Re: Strukturen speichen und laden

Verfasst: 22.07.2018 21:43
von Phil
Versuche es mit WriteStringN statt WriteString, dann brauchst du die Länge des Strings nicht angeben bei ReadString.

Re: Strukturen speichen und laden

Verfasst: 22.07.2018 22:44
von Kiffi
Hierfür kannst Du InsertJSONStructure() / ExtractJSONStructure() in Verbindung mit SaveJSON() / LoadJSON() nutzen:

Speichern:

Code: Alles auswählen

J = CreateJSON(#PB_Any)
InsertJSONStructure(JSONValue(J), @BraveEnkelin, MaidImWald)
SaveJSON(J, "Rotkäppchens_Haus.Dat")
FreeJSON(J)
Laden:

Code: Alles auswählen

J = LoadJSON(#PB_Any, "Rotkäppchens_Haus.Dat")
ExtractJSONStructure(JSONValue(J), @BraveEnkelin.MaidImWald, MaidImWald)
FreeJSON(J)
(die üblichen Tests, ob die Datei gespeichert / geladen werden konnte, habe ich jetzt der Einfachheit mal weg gelassen).

Grüße ... Peter

Re: Strukturen speichen und laden

Verfasst: 23.07.2018 20:58
von Qnode
@RSBasic
... werde künftig die richtigen Code-Tags verwenden... sorry

@ Phil
Hat geklappt. Laden der Daten funktioniert jetzt


@Kiffi
Habe das eingebaut und hat auch prima geklappt. Geht mit JSON sehr elegant, braucht weniger Code und ist wohl auch deutlich weniger fehleranfällig. Ich vermute daher, dass es in PureBasic eher unüblich ist, seine Structures quasi händisch zu speichern, so wie ich es gemacht habe. Richtig?

Re: Strukturen speichen und laden

Verfasst: 24.07.2018 15:01
von Kiffi
Qnode hat geschrieben:Ich vermute daher, dass es in PureBasic eher unüblich ist, seine Structures quasi händisch zu speichern, so wie ich es gemacht habe. Richtig?
so, wie Du es in Deinem Ursprungsposting gelöst hat, ist das vollkommen OK (und auch eigentlich der klassische BASIC-Weg).
PureBasic hat allerdings diese netten JSON-Features. Wieso sollte man die dann nicht auch nutzen? :-)
Ein weiterer Vorteil: Solltest Du später mal Deine MaidImWald-Struktur ändern / erweitern wollen, musst Du die Lade- und Speicher-Funktionalität nicht mehr anpassen.

Grüße ... Peter

Re: [gelöst]Strukturen speichen und laden

Verfasst: 24.07.2018 23:41
von Bisonte
Kiffi hat geschrieben:Ein weiterer Vorteil: Solltest Du später mal Deine MaidImWald-Struktur ändern / erweitern wollen, musst Du die Lade- und Speicher-Funktionalität nicht mehr anpassen.
Dem stimme ich 100% zu.

Eine Speicher- sowie Ladeprozedur als "Include" und seitdem kein stundenlanges Probieren mehr, wenn mal etwas dazukommt oder
rausfliegt ... Und man kann nix vergessen :mrgreen:

Re: [gelöst]Strukturen speichen und laden

Verfasst: 25.07.2018 07:33
von Qnode
Einziger "Nachteil" den ich sehe: Das JSON-Format speichert die Sachen im Klartext ab (hab's mir im Editor angesehen). Aber ich vermute, dafür gibt es auch Lösungen (hab in der Hilfe gesehen, dass es da eine Cipher-Bibliothek zum Verschlüsseln gibt).