Seite 1 von 1

Arrays und Listen - Memory speichern

Verfasst: 20.12.2004 16:25
von Dostej
Ich habe versucht Arrays und Listen schnell (und mit wenig tipperei) zu speichern. Hier das Ergebnis, vielleicht kanns ja jemand verwenden.

Code: Alles auswählen

CompilerIf #False
;{ reine arrays
; geht nicht mit Stringarrays
; Dimensionen
d1 = 10
d2 = 50

; array belegen
Dim test(d1, d2)
For x = 0 To d1
  For y = 0 To d2
    test(x, y) = x * d2 + y
  Next
Next

; array anzeigen
For x = 0 To d1
  For y = 0 To d2
    Debug "(" + Str(x) + " / " + Str(y) + "):   " + Str(test(x, y))
  Next
Next

; array abspeichern
ptr = @test()
size.l = (d1+1) * (d2+1) * 4 ; long = 4 byte
Debug "size: " +Str(size)
If CreateFile(1, "C:\temp\arraytest.arr")
  WriteData(ptr, size)
  CloseFile(1)
EndIf

; neues Array kreieren
Dim testneu(d1, d2)
ptr = @testneu()
size.l = (d1+1) * (d2+1) * 4
; Array laden
If ReadFile(1, "C:\temp\arraytest.arr")
  ReadData(ptr, size)
  CloseFile(1)
EndIf

Debug""
Debug""
; neues array anzeigen
For x = 0 To d1
  For y = 0 To d2
    Debug "(" + Str(x) + " / " + Str(y) + "):   " + Str(testneu(x, y))
  Next
Next
;}
CompilerEndIf 
CompilerIf #False
;{ Arrays mit Strukturen
; geht nicht mir Strukturen, die Strings beinhalten
Structure tst
  a.l
  b.l
  c.l
  d.b
  e.w
  f.f
EndStructure

d1 = 10
d2 = 50


; struktur belegen
Dim test.tst(d1, d2)
For x = 0 To d1
  For y = 0 To d2
    test(x, y)\a = x
    test(x, y)\b = y
    test(x, y)\c = x * d2 + y
    test(x, y)\d = y
    test(x, y)\e = x + y
    test(x, y)\f = x * d2 / y
  Next
Next

; struktur anzeigen
; For x = 0 To d1
  ; For y = 0 To d2
    ; Debug ""
    ; Debug "(" + Str(x) + " / " + Str(y) + ")"
    ; Debug "a: " + Str(test(x, y)\a)
    ; Debug "b: " + Str(test(x, y)\b)
    ; Debug "c: " + Str(test(x, y)\c)
    ; Debug "d: " + Str(test(x, y)\d)
    ; Debug "e: " + Str(test(x, y)\e)
    ; Debug "f: " + Strf(test(x, y)\f)
  ; Next
; Next

; Struktur abspeichern
ptr = @test()
size.l = (d1+1) * (d2+1) * SizeOf(tst)
Debug "size: " +Str(size)
If CreateFile(1, "C:\temp\arraytest.arr")
  WriteData(ptr, size)
  CloseFile(1)
EndIf

; neues array
Dim testneu.tst(d1, d2)

; Struktur laden
ptr = @testneu()
size.l = (d1+1) * (d2+1) * SizeOf(tst)
Debug "size: " +Str(size)
If ReadFile(1, "C:\temp\arraytest.arr")
  ReadData(ptr, size)
  CloseFile(1)
EndIf

; struktur anzeigen
For x = 0 To d1
  For y = 0 To d2
    Debug ""
    Debug "(" + Str(x) + " / " + Str(y) + ")"
    Debug "a: " + Str(testneu(x, y)\a)
    Debug "b: " + Str(testneu(x, y)\b)
    Debug "c: " + Str(testneu(x, y)\c)
    Debug "d: " + Str(testneu(x, y)\d)
    Debug "e: " + Str(testneu(x, y)\e)
    Debug "f: " + StrF(testneu(x, y)\f)
  Next
Next
;}
CompilerEndIf 
CompilerIf #True
;{ Listen
;geht auch wieder nicht mit strings...
Structure tst
  a.l
  b.l
  c.l
  d.b
  e.w
  f.f
EndStructure

d1 = 10
d2 = 50

; struktur belegen
NewList test.tst()
For x = 0 To d1
  For y = 0 To d2
    AddElement(test())
    test()\a = x
    test()\b = y
    test()\c = x * d2 + y
    test()\d = y
    test()\e = x + y
    test()\f = x * d2 / y
  Next
Next

;struktur anzeigen
; ResetList(test())
; While NextElement(test())
  ; Debug ""
  ; Debug "(" + Str(ListIndex(test())) + ")"
  ; Debug "a: " + Str(test()\a)
  ; Debug "b: " + Str(test()\b)
  ; Debug "c: " + Str(test()\c)
  ; Debug "d: " + Str(test()\d)
  ; Debug "e: " + Str(test()\e)
  ; Debug "f: " + StrF(test()\f)
; Wend

; Struktur abspeichern
  ; den pointer zum ersten Element erwischen)
SelectElement(test(), 0)
ptr = @test()

size.l = CountList(test()) * SizeOf(tst)
Debug "size: " +Str(size)
If CreateFile(1, "C:\temp\arraytest.arr")
  WriteData(ptr, size)
  CloseFile(1)
EndIf


; neue liste
NewList testneu.tst()
; elemente anhängen
For x = 0 To d1
  For y = 0 To d2
    AddElement(testneu())
  Next
Next

; Struktur laden
  ; den pointer zum ersten Element erwischen)
SelectElement(testneu(), 0)
ptr = @testneu()
Debug ptr

;size.l = (d1+1) * (d2+1) * SizeOf(tst)
Debug "size: " +Str(size)
If ReadFile(1, "C:\temp\arraytest.arr")
  ReadData(ptr, size)
  CloseFile(1)
EndIf

;struktur anzeigen
ResetList(testneu())
While NextElement(testneu())
  Debug ""
  Debug "(" + Str(ListIndex(test())) + ")"
  Debug "a: " + Str(testneu()\a)
  Debug "b: " + Str(testneu()\b)
  Debug "c: " + Str(testneu()\c)
  Debug "d: " + Str(testneu()\d)
  Debug "e: " + Str(testneu()\e)
  Debug "f: " + StrF(testneu()\f)
Wend
;}
CompilerEndIf 
Geht nicht mit Strings, weder als array noch in listen, da ja nur der Pointer auf den String dort gespeichert ist.

Verfasst: 20.12.2004 19:32
von NicTheQuick
Wenn man sich ein bisschen mit Pointern auskennt, ist das gar kein Problem.
Hier sind übrigens meine Routinen für Strukturen, dementsprechend auch für Strings.

Verfasst: 21.12.2004 10:04
von Dostej
Staun....
Siehst richtig gut aus...
Leider sind pointer nicht meine Stärke

Verfasst: 21.12.2004 16:36
von NicTheQuick
Dostej hat geschrieben:Siehst richtig gut aus...
Danke. :D
Aber ich hab leider schon eine Freundin. :wink:

Verfasst: 21.12.2004 16:43
von Dostej
àhm, leider ein Tippfehler... :oops:

Sollte klar heissen:
Sieht gut aus...