Tableau Dynamique pouvant être incorporé dans des structures
Publié : dim. 30/sept./2007 10:31
Rien de bien nouveau, il sagit simplement d'une formalisation obtenue grace aux Macros.
J'aurai aimé m'affranchir de l'instruction InitArray, mais j'ai peur qu'il n'y ai pas d'autre issue...
Et un exemple d'utilisation:
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