Ich habe mal auf die Schnelle eine solche dynamische Struktur für dich gebastelt, die man zur Laufzeit erstellen und nutzen kann. Du musst sie jetzt nur noch mit einer Map verknüpfen. Ein Beispiel dazu ist am Ende zu sehen.
Code: Alles auswählen
EnableExplicit
Structure BasicTypes
StructureUnion
a.a
b.b
c.c
d.d
f.f
i.i
l.l
q.q
s.String
u.u
w.w
EndStructureUnion
EndStructure
Structure DynamicStructure
types.s
*data.BasicTypes[0]
EndStructure
Macro newDynamicStructureElement(dynamicStructure, position, structureName)
dynamicStructure\data[position] = AllocateMemory(SizeOf(structureName))
If Not dynamicStructure\data[position]
ProcedureReturn #False
EndIf
InitializeStructure(dynamicStructure\data[position], structureName)
EndMacro
Macro freeDynamicStructureElement(dynamicStructure, position, structureName)
ClearStructure(dynamicStructure\data[position], structureName)
FreeMemory(dynamicStructure\data[position])
EndMacro
Procedure freeDynamicStructure(*ds.DynamicStructure)
Protected elements.i = Len(*ds\types)
Protected *c.Character = @*ds\types
Protected i.i = 0, size.i
While *c\c
Select *c\c
Case 'a': freeDynamicStructureElement(*ds, i, Ascii)
Case 'b': freeDynamicStructureElement(*ds, i, Byte)
Case 'c': freeDynamicStructureElement(*ds, i, Character)
Case 'd': freeDynamicStructureElement(*ds, i, Double)
Case 'f': freeDynamicStructureElement(*ds, i, Float)
Case 'i': freeDynamicStructureElement(*ds, i, Integer)
Case 'l': freeDynamicStructureElement(*ds, i, Long)
Case 'q': freeDynamicStructureElement(*ds, i, Quad)
Case 's': freeDynamicStructureElement(*ds, i, String)
Case 'u': freeDynamicStructureElement(*ds, i, Unicode)
Case 'w': freeDynamicStructureElement(*ds, i, Word)
Default:
ProcedureReturn #False
EndSelect
i + 1
*c + SizeOf(Character)
Wend
ClearStructure(*ds, DynamicStructure)
FreeMemory(*ds)
EndProcedure
Procedure.i newDynamicStructure(types.s)
Protected elements.i = Len(types)
Protected *ds.DynamicStructure = AllocateMemory(SizeOf(DynamicStructure) + SizeOf(Integer) * elements) ;because SizeOf(Integer) == SizeOf(Pointer)
InitializeStructure(*ds, DynamicStructure)
*ds\types = ""
Protected *c.Character = @types
Protected i.i = 0, size.i
While *c\c
Select *c\c
Case 'a': newDynamicStructureElement(*ds, i, Ascii)
Case 'b': newDynamicStructureElement(*ds, i, Byte)
Case 'c': newDynamicStructureElement(*ds, i, Character)
Case 'd': newDynamicStructureElement(*ds, i, Double)
Case 'f': newDynamicStructureElement(*ds, i, Float)
Case 'i': newDynamicStructureElement(*ds, i, Integer)
Case 'l': newDynamicStructureElement(*ds, i, Long)
Case 'q': newDynamicStructureElement(*ds, i, Quad)
Case 's': newDynamicStructureElement(*ds, i, String)
Case 'u': newDynamicStructureElement(*ds, i, Unicode)
Case 'w': newDynamicStructureElement(*ds, i, Word)
Default:
freeDynamicStructure(*ds)
ProcedureReturn #False
EndSelect
i + 1
*ds\types + Chr(*c\c)
*c + SizeOf(Character)
Wend
ProcedureReturn *ds
EndProcedure
;=================== EXAMPLE ===================
Define *ds.DynamicStructure
;Definiere eine Struktur anhand der Kurzbezeichnungen von PB
*ds.DynamicStructure = newDynamicStructure("iisls")
;Jetzt können wir die einzelnen Positionen beschreiben.
*ds\data[0]\i = 123
*ds\data[1]\i = -456
;Auf Strings müssen wir auf Grund einer Sicherheitsmaßnahme in PB etwas komplizierter zugreifen.
*ds\data[2]\s\s = "Test"
*ds\data[3]\l = 789
*ds\data[4]\s\s = "String"
;Danach kann man die Werte wieder lesen
Debug *ds\data[0]\i
Debug *ds\data[1]\i
Debug *ds\data[2]\s\s
Debug *ds\data[3]\l
Debug *ds\data[4]\s\s
;Und wenn wir die dynamische Struktur nicht mehr brauchen, sollten wir sie wieder freigeben.
freeDynamicStructure(*ds)