Seite 2 von 2

Verfasst: 22.06.2007 20:05
von ts-soft
Der Beschreibung nach ist das ein Fall für XML :wink:

Verfasst: 23.06.2007 04:06
von mk-soft
Purebasic mach keine Prüfung auf bereichsüberschreitung von Arrays.
Das must man selber machen. Finde ich aber Gut

Code: Alles auswählen

Structure udtDaten
  lVal.l
  fltVal.f
EndStructure


Structure udtDatenArray
  ds.udtDaten[0]
EndStructure

; Speicher anfordern

*daten.udtDatenArray = AllocateMemory(10000 * SizeOf(udtDaten))

For i = 1 To 10000
  With *daten
    \ds[i]\lVal = i
    \ds[i]\fltVal = i / 100.0
  EndWith
Next

For i = 1 To 10000 Step 100
  With *daten
    Debug \ds[i]\lVal
    Debug \ds[i]\fltVal
  EndWith
Next

Verfasst: 23.06.2007 07:43
von Leonhard
Mit dem Problem hab ich mich auch länger rumgeschlagen und hab mir dann gesagt, ich benötige eine neue Liste. Nach mühseligen Arbeiten hab ich mir eine eigene Liste gebastelt, die auf einem Interface basiert. Wenn du diese haben möchtest, brauchst du mich nur Fragen (ist ein bischen umständlich, da Elemente immer als Pointer vorhanden sein müssen).

Verfasst: 23.06.2007 08:19
von Thorium
mk-soft hat geschrieben:

Code: Alles auswählen

Structure udtDaten
  lVal.l
  fltVal.f
EndStructure


Structure udtDatenArray
  ds.udtDaten[0]
EndStructure

; Speicher anfordern

*daten.udtDatenArray = AllocateMemory(10000 * SizeOf(udtDaten))

For i = 1 To 10000
  With *daten
    \ds[i]\lVal = i
    \ds[i]\fltVal = i / 100.0
  EndWith
Next

For i = 1 To 10000 Step 100
  With *daten
    Debug \ds[i]\lVal
    Debug \ds[i]\fltVal
  EndWith
Next
Das ist genau was ich brauche, cool. Muss ich mir nur mein eigenes ReDim programmieren, was halt den Speicher allokiert und wieder freigibt, aber das ist ja kein Problem. Thx. :allright:

Verfasst: 23.06.2007 12:03
von mk-soft
Achtung Bug!!!

War wohl etwas müde.
Bei *daten.udtDatenArray = AllocateMemory(10000 * SizeOf(udtDaten)) ist der Index natürlich 0..9999 und nicht 1 bis 10000


Speicherleck bei Strukturen mit Strings und AllocateMemory

FreeMemory gibt ja nur den Speicher der Struktur wieder frei.
Nicht aber den Speicher der von den Strings verwendet wird.
Dieses muss man vorher selber ausführen.

Code: Alles auswählen

; Strukturen
Structure udtDaten
  lVal.l
  fltVal.f
  strVal.s
EndStructure


Structure udtDatenArray
  ds.udtDaten[0]
EndStructure

; Compiler erwingen '_SYS_FreeString@4' anzulegen
Procedure Dummy()
  Protected Dummy.s
  Dummy = ""
EndProcedure
; String speicher komplett freigeben  
Procedure FreeString(*Adr)
  !PUSH   dword [p.p_Adr]
  !CALL  _SYS_FreeString@4
EndProcedure

; -------------------------------------------------------------------


; Speicher anfordern
*daten.udtDatenArray = AllocateMemory(10000 * SizeOf(udtDaten))
; Daten füllen
For i = 0 To 9999
  With *daten
    \ds[i]\lVal = i
    \ds[i]\fltVal = i / 100.0
    \ds[i]\strVal = "Wert: " + Str(i)
  EndWith
Next
; Daten ausgeben
For i = 0 To 9999 Step 100
  With *daten
    Debug \ds[i]\lVal
    Debug \ds[i]\fltVal
    Debug \ds[i]\strVal
  EndWith
Next
; Speicher freigeben
For i = 0 To 9999
  FreeString(@*daten\ds[i]\strVal)
Next
FreeMemory(*daten)
FF :wink:

Verfasst: 23.06.2007 12:09
von ts-soft
Deinen Dummy kannste weglassen und FreeString ändern :wink:

Code: Alles auswählen

;; String speicher komplett freigeben 
Procedure FreeString(*Adr)
  Protected Dummy.s
  !PUSH   dword [p.p_Adr]
  !CALL  _SYS_FreeString@4
EndProcedure

Verfasst: 23.06.2007 12:11
von mk-soft
:allright:

Verfasst: 23.06.2007 16:37
von Little John
2mk-soft:
Dein Code erweitert die vorhandenen Möglichkeiten beträchtlich!
Dann ist evtl. zu hoffen dass sowas bald direkt in PB eingebaut ist? :D
Willst Du den Code nicht bis dahin bei "Code, Tipps und Tricks" einstellen?
Er ist IMHO zu wichtig, als dass er irgendwo in den Tiefen des Forums verbleiben sollte.

Gruß, Little John