Page 1 sur 1

Tableau Dynamique pouvant être incorporé dans des structures

Publié : dim. 30/sept./2007 10:31
par Dräc
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...

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
Et un exemple d'utilisation:

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

Publié : lun. 08/oct./2007 21:47
par Dräc
Voici une version améliorée:
Les tableaux peuvent etre soient de simples variables soient incorporés dans des structures. En outre, il est possible de les passer en paramètre des procedure.

Code : Tout sélectionner

;===================================================== 
; Array 
; 
; Dynamic Array to be embedded into structures 
; 
; Dräc - Oct 2007 
;===================================================== 

Macro AsArray(Struc) 
   Struc#_Array 
EndMacro 

Macro ArrayIterator(Struc) 
   Struc#_ArrayIterator 
EndMacro 

Macro InitArray(Struc) 
   CompilerIf Defined(AsArray(Struc), #PB_Structure) = #False 
    
   Structure ArrayIterator(Struc) 
    Select.Struc[0] 
   EndStructure 
    
   Structure AsArray(Struc) 
    Size.l 
    *Data.ArrayIterator(Struc) 
   EndStructure 
          
   CompilerEndIf 
EndMacro 

Macro ArraySize(Array) 
  Array\Size 
EndMacro 

Macro ArrayData(Array) 
  Array\Data 
EndMacro 

Macro Array(Array, Index) 
  ArrayData(Array)\Select[Index] 
EndMacro 

;---------------------------- Dim / ReDim ------------------------------- 
; 
; Dim is used to 'size' the new arrays. An array can be of any types, 
; including structured, and user defined types. 
; Once an array is defined it can be resized with ReDim. 
; Arrays are dynamically allocated which means than a variable or an 
; expression can be used to size them. 
; 
; 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) 
  ArraySize(Array) = Size 
  ArrayData(Array) = @ArraySize(Array); give a dummy valide adress for the data length computation 
  ArrayData(Array) = AllocateMemory((@ArrayData(Array)\Select[1]-@ArrayData(Array)\Select[0])*Size) 
EndMacro 

Macro ReDim(Array, Size) 
  ArraySize(Array) = Size 
  ArrayData(Array) = ReAllocateMemory(ArrayData(Array), (@ArrayData(Array)\Select[1]-@ArrayData(Array)\Select[0])*Size) 
EndMacro 


;===================================================== 
;{ Test Code 


Debug "================================================" 
Debug "   Test case: Array embedded into a structure   " 
Debug "================================================" 

InitArray(q) 
InitArray(point) 

Structure Struc 
 a.l 
 b.f 
 Table.AsArray(q) 
 c.q 
 d.d 
 MyPoint.AsArray(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 


Debug "================================================" 
Debug "           Test case: Array standalone          " 
Debug "================================================" 

InitArray(q) 
InitArray(point) 

Table.AsArray(q) 
MyPoint.AsArray(point) 

Debug "----- Dim Table -----" 
Dim(Table, 15) 
Array(Table,0)=10 
Array(Table,1)=20 
Array(Table,2)=30 
Array(Table,3)=60 
;                        
Debug Array(Table,0) 
Debug Array(Table,1) 
Debug Array(Table,2) 
Debug Array(Table,3) 
Debug "Array Size: "+Str(ArraySize(Table)) 

Debug "---- ReDim Table ----" 
ReDim(Table, 40) 
Array(Table,30)=100 
Array(Table,31)=200 
Array(Table,32)=300 
Array(Table,33)=600 
;                        
Debug Array(Table,0) 
Debug Array(Table,1) 
Debug Array(Table,2) 
Debug Array(Table,3) 
Debug Array(Table,30) 
Debug Array(Table,31) 
Debug Array(Table,32) 
Debug Array(Table,33) 
Debug "Array Size: "+Str(ArraySize(Table)) 
; 

Debug "----- Dim MyPoint -----" 
Dim(MyPoint, 15) 
Array(MyPoint,0)\x=10 
Array(MyPoint,0)\y=11 
Array(MyPoint,1)\x=20 
Array(MyPoint,1)\y=21 

Debug Array(MyPoint,0)\x=10 
Debug Array(MyPoint,0)\y=11 
Debug Array(MyPoint,1)\x=20 
Debug Array(MyPoint,1)\y=21 
;} 
;=====================================================