Tableau Dynamique pouvant être incorporé dans des structures

Sujets variés concernant le développement en PureBasic
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Tableau Dynamique pouvant être incorporé dans des structures

Message 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
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message 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 
;} 
;=====================================================
Répondre