[gelöst]Strukturen speichen und laden

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Qnode
Beiträge: 67
Registriert: 19.07.2018 20:41
Computerausstattung: i5, 16GB RAM, Win10, PureBasic 6.00 (Windows - x64)

[gelöst]Strukturen speichen und laden

Beitrag 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
Zuletzt geändert von Qnode am 23.07.2018 20:59, insgesamt 1-mal geändert.
Phil
Beiträge: 32
Registriert: 05.07.2006 10:46

Re: Strukturen speichen und laden

Beitrag von Phil »

Versuche es mit WriteStringN statt WriteString, dann brauchst du die Länge des Strings nicht angeben bei ReadString.
PB 5.62 on Win10
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Strukturen speichen und laden

Beitrag 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
Hygge
Benutzeravatar
Qnode
Beiträge: 67
Registriert: 19.07.2018 20:41
Computerausstattung: i5, 16GB RAM, Win10, PureBasic 6.00 (Windows - x64)

Re: Strukturen speichen und laden

Beitrag 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?
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Strukturen speichen und laden

Beitrag 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
Hygge
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: [gelöst]Strukturen speichen und laden

Beitrag 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:
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Qnode
Beiträge: 67
Registriert: 19.07.2018 20:41
Computerausstattung: i5, 16GB RAM, Win10, PureBasic 6.00 (Windows - x64)

Re: [gelöst]Strukturen speichen und laden

Beitrag 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).
Antworten