J'aurai aimé m'affranchir de l'instruction InitArray, mais j'ai peur qu'il n'y ai pas d'autre issue...
Code : Tout sélectionner
;=====================================================
; Array
;
; Tableau Dynamique pouvant être incorporé dans des structures
;
; Dräc - Sept 2007
;=====================================================
Macro InitArray(Struc)
CompilerIf Defined(Struc#_Array, #PB_Structure) = #False
Structure Struc#_Array
Data.Struc[0]
EndStructure
CompilerEndIf
EndMacro
Macro NewArray(Array, Struc)
Array#_size.l
*Array.Struc#_Array
EndMacro
Macro ArraySize(Array)
Array#_size
EndMacro
Macro Array(Array, Index)
Array\Data[Index]
EndMacro
;---------------------------- Dim / ReDim -------------------------------
;
; Dim est utilisé pour dimensionner un nouveau tableau. Un tableau peut
; être composé d'éléments de type quelconque connu sous PureBasic,
; incluant les structures et les types définis par l'utilisateur
; (Attention : les éléments d'un tableau sont tous de même type).
; Une fois le tableau créé il peut être redimensionné mais son contenu
; sera alors effacé, sauf si ReDim est utilisé. Les tableaux sont alloués
; dynamiquement ce qui signifie que le dimensionnement peut se faire à
; partir d'une variable ou d'une expression.
;------------------------------------------------------------------------
Macro Dim(Array, Size)
Array#_size = Size
Array = @Array#_size; give a dummy valide adress for the data length computation
Array = AllocateMemory((@Array\Data[1]-@Array\Data[0])*Size)
EndMacro
Macro ReDim(Array, Size)
Array#_size = Size
Array = ReAllocateMemory(Array, (@Array\Data[1]-@Array\Data[0])*Size)
EndMacro
Code : Tout sélectionner
InitArray(q)
InitArray(point)
Structure Struc
a.l
b.f
NewArray(Table, q)
c.q
d.d
NewArray(MyPoint, point)
e.l
EndStructure
MyStructure.Struc
MyStructure\a= 300
MyStructure\b= 1./3.
MyStructure\c= 999999999999
MyStructure\d= ACos(-1)
MyStructure\e= 100
Debug "---- Check others field of the structure ----"
Debug MyStructure\a
Debug MyStructure\b
Debug MyStructure\c
Debug MyStructure\d
Debug MyStructure\e
Debug "----- Dim Table -----"
Dim(MyStructure\Table, 15)
Array(MyStructure\Table,0)=10
Array(MyStructure\Table,1)=20
Array(MyStructure\Table,2)=30
Array(MyStructure\Table,3)=60
;
Debug Array(MyStructure\Table,0)
Debug Array(MyStructure\Table,1)
Debug Array(MyStructure\Table,2)
Debug Array(MyStructure\Table,3)
Debug "Array Size: "+Str(ArraySize(MyStructure\Table))
Debug "---- ReDim Table ----"
ReDim(MyStructure\Table, 40)
Array(MyStructure\Table,30)=100
Array(MyStructure\Table,31)=200
Array(MyStructure\Table,32)=300
Array(MyStructure\Table,33)=600
;
Debug Array(MyStructure\Table,0)
Debug Array(MyStructure\Table,1)
Debug Array(MyStructure\Table,2)
Debug Array(MyStructure\Table,3)
Debug Array(MyStructure\Table,30)
Debug Array(MyStructure\Table,31)
Debug Array(MyStructure\Table,32)
Debug Array(MyStructure\Table,33)
Debug "Array Size: "+Str(ArraySize(MyStructure\Table))
;
Debug "---- Check others field of the structure ----"
Debug MyStructure\a
Debug MyStructure\b
Debug MyStructure\c
Debug MyStructure\d
Debug MyStructure\e
Debug "----- Dim MyPoint -----"
Dim(MyStructure\MyPoint, 15)
Array(MyStructure\MyPoint,0)\x=10
Array(MyStructure\MyPoint,0)\y=11
Array(MyStructure\MyPoint,1)\x=20
Array(MyStructure\MyPoint,1)\y=21
Debug Array(MyStructure\MyPoint,0)\x=10
Debug Array(MyStructure\MyPoint,0)\y=11
Debug Array(MyStructure\MyPoint,1)\x=20
Debug Array(MyStructure\MyPoint,1)\y=21