Seite 1 von 2

Array()- save and load

Verfasst: 24.12.2024 11:20
von Blitzer
Hallo,

ich suche nach einer Möglichkeit ein statisches Array abzuspeichern. Später soll es wieder eingelesen werden.

Hier ein Beispiel in einer anderen Programmiersprache:
'Write Array
open "myfile" for binary as #1
put #1,,myarray()
close #1

'Read Array
open "myfile" for binary as #1
get #1,,myarray()
close #1
(Dynamische Arrays können beim Einlesen auch re-dimensioniert werden.)

Eine Lösung als 3-Zeiler wäre wünschenswert.

Blitzer

Re: Array()- save and load

Verfasst: 24.12.2024 12:26
von Bisonte
Man nehme JSON ... dreizeilig zwar nicht so ganz, aber effektiv ;)

Code: Alles auswählen

Global Dim MyArray(10)

Procedure.i SaveJSonArray(FileName.s)
  
  Protected jSon = CreateJSON(#PB_Any, #PB_JSON_NoCase)
  Protected Result = #False
  
  If jSon
    InsertJSONArray(JSONValue(jSon), MyArray())
    Result = SaveJSON(jSon, Filename, #PB_JSON_PrettyPrint)
    FreeJSON(jSon)
  EndIf
  
  ProcedureReturn Result
  
EndProcedure

SaveJSonArray("myArrayData.array")

Re: Array()- save and load

Verfasst: 24.12.2024 13:26
von Blitzer
Mit dem Lösungsweg komme ich klar.
Leider mit viel Text, also fehlerträchtig und nur mit tiefergehenden Kenntnissen zu stemmen.

Halt eben 365 zu 57 Zeichen.
Nicht deine Lösung ist der Weg, sondern dein Weg ist die Lösung. :lol:

Thx

Re: Array()- save and load

Verfasst: 24.12.2024 15:12
von H.Brill
Kann ich noch kürzer (54 Zeichen) und eine Zeile weniger mit XProfan :
' Write Array
Move("ArrToList", myarray[])
Move("ListToFile", "myfile")
' Read Array
Move("FileToList, "myfile")
Move("ListToArr", myarray[])

' bei numerischen Array wird automatisch konvertiert
😎

Re: Array()- save and load

Verfasst: 24.12.2024 16:10
von mk-soft
Nur für Integer oder angepasst Byte, Word, etc. Ausser für String, Maps, List ;)

Code: Alles auswählen

;- TOP

; Nicht für String oder Structuren

Procedure SaveArray(FileName.s, Array ArrayData(1)) ; Result: Bytes written
  Protected file, size
  
  file = CreateFile(#PB_Any, FileName)
  If Not file
    Debug "Error: Create File " + FileName
    ProcedureReturn 0
  EndIf
  
  size = (ArraySize(ArrayData()) + 1) * SizeOf(Integer)
  If WriteData(file, @ArrayData(), size)
    CloseFile(file)
    ProcedureReturn size
  Else
    CloseFile(file)
    Debug "Error: Write Array Data"
    ProcedureReturn 0
  EndIf
EndProcedure

Procedure LoadArray(FileName.s, Array ArrayData(1)) ; Result : ArraySize
  Protected file, size, size2
  
  file = ReadFile(#PB_Any, FileName)
  If Not file
    Debug "Error: Read File " + FileName
    ProcedureReturn 0
  EndIf
  
  size = Lof(file)
  If size
    size2 = (size / SizeOf(Integer)) - 1
    Dim ArrayData(size2)
    If ReadData(file, @ArrayData(), size)
      CloseFile(file)
      ProcedureReturn size2
    Else
      CloseFile(file)
      Debug "Error: Read Array Data"
      ProcedureReturn 0
    EndIf
  Else
    Debug "Error: Array Data Len"
    ProcedureReturn 0
  EndIf
EndProcedure

Global Dim MyArray.i(100)

RandomSeed(100)

For i = 0 To 100
  MyArray(i) = Random(1000, 1)
Next

filename.s = GetUserDirectory(#PB_Directory_Downloads) + "ArrayData.bin"

r1 = SaveArray(filename, MyArray())
Debug "Save Bytes written: " + r1

Global Dim MyArray2.i(0)

r1 = LoadArray(filename, MyArray2())
Debug "Load Array Size: " + r1

If CompareArray(MyArray(), MyArray2())
  Debug "Compare array ok"
EndIf

Re: Array()- save and load

Verfasst: 25.12.2024 10:01
von Blitzer
@mk-soft
Ein sehr schönes Beispiel ... :)

@H.Brill
Ich habe gerade mal nachgesehen, die Zeit als Profaner liegt schon mehr als 20 Jahre zurück.
In dieser Zeit hat sich viel geändert, vieles ist anders, aber nur weniges ist besser.
Ich finde den Befehlssatz und die Syntax von XProfan als optimal gelungen und zeitlos ...

Blitzer

Re: Array()- save and load

Verfasst: 25.12.2024 13:48
von H.Brill
Blitzer hat geschrieben: 25.12.2024 10:01 @mk-soft
Ein sehr schönes Beispiel ... :)

@H.Brill
Ich habe gerade mal nachgesehen, die Zeit als Profaner liegt schon mehr als 20 Jahre zurück.
In dieser Zeit hat sich viel geändert, vieles ist anders, aber nur weniges ist besser.
Ich finde den Befehlssatz und die Syntax von XProfan als optimal gelungen und zeitlos ...

Blitzer
Ja, hat sich viel verändert, besonders auf die Sprünge auf die X-Versionen und ganz besonders der Riesensprung
auf X4. Ich finde es auch etwas (quer)einsteigerfreundlicher als PB mit seinen Eventschleifen bei der GUI. Habe ich
hier im Forum öfters bei neuen Usern gemerkt. Obwohl sie es sich mit den neuen Bind-Befehlen leichter machen könnten.
Benutze halt beides (PB + XProfan) gerne. Profan war ja auch damals Anfang 90er mein Einstieg.
Also war das Huhn (Profan) eher da, als das Ei (PB) :lol:

Re: Array()- save and load

Verfasst: 25.12.2024 15:16
von Rings
Bisonte hat geschrieben: 24.12.2024 12:26 Man nehme JSON ... dreizeilig zwar nicht so ganz, aber effektiv ;)

Code: Alles auswählen

Global Dim MyArray(10)

Procedure.i SaveJSonArray(FileName.s)
  
  Protected jSon = ComposeJSON(#PB_Any, #PB_JSON_PrettyPrint)
  Protected Result = #False
  
  If jSon
    InsertJSONArray(JSONValue(jSon), MyArray())
    Result = SaveJSON(jSon, Filename, #PB_JSON_PrettyPrint)
    FreeJSON(jSon)
  EndIf
  
  ProcedureReturn Result
  
EndProcedure

SaveJSonArray("myArrayData.array")
Mach ich da was falsch, lässt sich nicht kompilieren, Fehler bei
Zeile 5, Trying write a string variable in numeric...

Re: Array()- save and load

Verfasst: 25.12.2024 15:58
von Bisonte
upsi ;)
Bin da etwas verrutscht bei meiner Copy & Paste Aktion ....
die Zeile 5 muss natürlich heissen : Protected jSon = CreateJSON(#PB_Any, #PB_JSON_NoCase)

Aber gut das das auch mal einer ausprobiert hat :D .... (Originalpost natürlich editiert)

Re: Array()- save and load

Verfasst: 26.12.2024 12:43
von mk-soft
Ich habe auch noch Profan 4.5 ...
Das lief auf Windows 3.11 ;)