Ich hab hier auch noch eine andere Möglichkeit, wenn du die willst. Die
müsste auch mit PB V3.3 funktionieren. Hab sie gerade extra etwas
abgeändert. Sie ist auch dynamisch, aber weniger komfortabel.
Code: Alles auswählen
Procedure SetString(*pPtr.Long, String.s)
Protected Size.l = Len(String)
If Size = 0
If *pPtr\l
FreeMemory(*pPtr\l)
*pPtr\l = 0
ProcedureReturn #True
Else
ProcedureReturn #True
EndIf
EndIf
*pPtr\l = ReAllocateMemory(*pPtr\l, Size + SizeOf(Long) + 1)
If *pPtr\l
PokeL(*pPtr\l, Size)
PokeS(*pPtr\l + SizeOf(Long), String)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.s GetString(*pPtr.Long)
If *pPtr\l
ProcedureReturn PeekS(*pPtr\l + SizeOf(Long), PeekL(*pPtr\l))
EndIf
ProcedureReturn ""
EndProcedure
Procedure.l StringLength(*pPtr.Long)
If *pPtr\l
ProcedureReturn PeekL(*pPtr\l)
EndIf
ProcedureReturn 0
EndProcedure
Structure SArray
*arr
c.l
EndStructure
Procedure SA_Add(*SArray.SArray, String.s) ;Fügt einen neuen String ans Ende hinzu
Protected *tmp
*tmp = ReAllocateMemory(*SArray\arr, (*SArray\c + 1) * SizeOf(*tmp))
If *tmp
*SArray\arr = *tmp
*tmp + *SArray\c * SizeOf(*tmp)
SetString(*tmp, String)
*SArray\c + 1
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure SA_Del(*SArray.SArray, pos.l) ;Löscht String an Position
Protected *tmp
If pos >= 0 And pos < *SArray\c
*tmp = *SArray\arr + pos * SizeOf(*tmp)
SetString(*tmp, "")
MoveMemory(*tmp + SizeOf(*tmp), *tmp, (*SArray\c - pos - 1) * SizeOf(*tmp))
*SArray\c - 1
If *SArray\c
*SArray\arr = ReAllocateMemory(*SArray\arr, *SArray\c * SizeOf(*tmp))
Else
FreeMemory(*SArray\arr)
*SArray\arr = 0
EndIf
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure SA_Set(*SArray.SArray, pos.l, String.s) ;Setzt String
Protected *tmp
If pos >= 0 And pos < *SArray\c
*tmp = *SArray\arr + pos * SizeOf(*tmp)
SetString(*tmp, String)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.s SA_Get(*SArray.SArray, pos.l) ;Gibt String zurück
Protected *tmp
If pos >= 0 And pos < *SArray\c
*tmp = *SArray\arr + pos * SizeOf(*tmp)
ProcedureReturn GetString(*tmp)
EndIf
ProcedureReturn ""
EndProcedure
Procedure SA_Move(*SArray.SArray, pos.l, newpos.l) ;Verschiebt String an neue Position
Protected *String, *tmp.SArray
If pos = newpos : ProcedureReturn #False : EndIf
If pos >= 0 And newpos >= 0 And pos < *SArray\c And newpos < *SArray\c
*tmp = *SArray\arr + pos * SizeOf(Long)
*String = *tmp\arr
If pos < newpos
MoveMemory(*tmp + SizeOf(*String), *tmp, (newpos - pos) * SizeOf(*String))
*tmp = *SArray\arr + newpos * SizeOf(*String)
*tmp\arr = *String
Else
*tmp = *SArray\arr + newpos * SizeOf(*String)
MoveMemory(*tmp, *tmp + SizeOf(*String), (pos - newpos) * SizeOf(*String))
*tmp\arr = *String
EndIf
EndIf
EndProcedure
Procedure SA_Clear(*SArray.SArray) ;Löscht das gesamte Array
Protected a.l, *tmp = *SArray\arr
For a = 1 To *SArray\c
SetString(*tmp, "")
*tmp + SizeOf(String)
Next
If *SArray\arr : FreeMemory(*SArray\arr) : EndIf
*SArray\arr = 0
*SArray\c = 0
EndProcedure
Structure Lager
item.s
Lager.SArray
EndStructure
Define Lager.Lager
Lager\item = "Kuchen"
items = Random(10)
For a = 1 To items
SA_Add(Lager\Lager, Str(a))
Next
Debug Lager\item
For a = 1 To Lager\Lager\c ;Anzahl Elemente
Debug SA_Get(Lager\Lager, a - 1)
Next
Debug ""
SA_Clear(Lager\Lager)
Debug Lager\Lager\c