Page 1 sur 1

Allocation Dynamique sur différentes structures

Publié : mer. 03/oct./2012 10:50
par PAPIPP
Bonjour à tous.
Il existe 2 structures type permettant une allocation dynamique exemples :
Première structure type classique accessible par allocatememory() avec pointeur.

Code : Tout sélectionner

Structure cr ; 
    VA.a[0]   ; ascii
    VB.b[0]   ; byte
    VC.c[0]   ; character
    VS.s{1}[0]; String 1 Byte
    VS2.s{2}[0]; String 2 Bytes
    VS3.s{3}[0]; String 3 Bytes
    VS4.s{4}[0]; String 4 Bytes
    VS8.s{8}[0]; String 8 Bytes
    Vu.u[0]   ; unicode
    Vw.w[0]   ; word
    Vl.l[0]   ; long
    Vi.i[0]   ; integer
    Vq.q[0]   ; quad
    Vf.f[0]   ; float
    Vd.d[0]   ; double
EndStructure
La deuxième structure sous forme de tableau accessible avec ReDim

Code : Tout sélectionner

Structure pa ; 
    Array VA.a(0)   ; ascii
    Array VB.b(0)   ; byte
    Array VC.c(0)   ; character
    Array VS.s{1}(0);  String 1 Byte
    Array VS2.s{2}(0); String 2 Bytes
    Array VS3.s{3}(0); String 3 Bytes
    Array VS4.s{4}(0); String 4 Bytes
    Array VS8.s{8}(0); String 8 Bytes
    Array Vu.u(0)   ; unicode
    Array Vw.w(0)   ; word
    Array Vl.l(0)   ; long
    Array Vi.i(0)   ; integer
    Array Vq.q(0)   ; quad
    Array Vf.f(0)   ; float
    Array Vd.d(0)   ; double
EndStructure
J’ai pu obtenir une allocation dynamique par ReDim sur une structure en tableau
et une allocation dynamique par allocatememory() sur pointeur
et aussi par allocatememory() avec une petite bidouille sur une structure en tableau.
Mais je n’ai pas pu allouer dynamiquement la première structure type classique avec ReDim

Voici le PRG et les trois méthodes d'allocation dynamique que j'ai testées.
Pour des besoins personnels j’ai placé toutes les définitions en structure union.

Code : Tout sélectionner

Structure S_X_cr ; S comme structure X comme dimension inconnue et cr comme crochet []
  StructureUnion
    VA.a[0]   ; ascii
    VB.b[0]   ; byte
    VC.c[0]   ; character
    VS.s{1}[0]; String 1 Byte
    VS2.s{2}[0]; String 2 Bytes
    VS3.s{3}[0]; String 3 Bytes
    VS4.s{4}[0]; String 4 Bytes
    VS8.s{8}[0]; String 8 Bytes
    Vu.u[0]   ; unicode
    Vw.w[0]   ; word
    Vl.l[0]   ; long
    Vi.i[0]   ; integer
    Vq.q[0]   ; quad
    Vf.f[0]   ; float
    Vd.d[0]   ; double
  EndStructureUnion
EndStructure
Structure S_X_pa ;  S comme structure X comme dimension inconnue et pa comme parenthèse ()
  StructureUnion
    Array VA.a(0)   ; ascii
    Array VB.b(0)   ; byte
    Array VC.c(0)   ; character
    Array VS.s{1}(0);  String 1 Byte
    Array VS2.s{2}(0); String 2 Bytes
    Array VS3.s{3}(0); String 3 Bytes
    Array VS4.s{4}(0); String 4 Bytes
    Array VS8.s{8}(0); String 8 Bytes
    Array Vu.u(0)   ; unicode
    Array Vw.w(0)   ; word
    Array Vl.l(0)   ; long
    Array Vi.i(0)   ; integer
    Array Vq.q(0)   ; quad
    Array Vf.f(0)   ; float
    Array Vd.d(0)   ; double
  EndStructureUnion
EndStructure

Structure com_cr_pa
  StructureUnion
    cr.S_X_cr
    pa.S_X_pa
  EndStructureUnion
EndStructure
; Structure com_pa_cr
;   StructureUnion
;     pa.S_X_pa
;     cr.S_X_cr
;   EndStructureUnion
; EndStructure

Define *Tcr.S_X_cr,*Tpa.S_X_PA,Tpa.S_X_pa,Tcr.S_X_cr
MAX=256
; ****  allocation dynamique
Debug "*****  Première méthode d'allocation dynamique avec ReDim Tpa\VA(2048) sur tableau"
ReDim Tpa\VA(2048); Première méthode d'allocation dynamique avec redim sur tableau
; ReDim Tcr\VA[1024]; erreur de syntaxe donc impossibilité d'allouer dynamiquement par cette méthode
Debug "*****  Deuxième méthode d'allocation dynamique avec allocatememory sur un pointeur"

*Tcr=AllocateMemory(2048)
*Tpa=AllocateMemory(2048); instruction permettant l'allocation dynamique mais impossibilité d'exploiter cette zone
For i=0 To 256 
  tpa\VA(i)=i
  *Tcr\Vw[i]=i*2
  ; *Tpa\VA(i)=i*3 ; impossible de faire fonctionner cette instruction
Next
Debug "hex(Tpa)="+Hex(Tpa)+" Hex(@Tpa\VA(0)]="+Hex(@Tpa\VA(0))+" Hex(*Tcr)="+Hex(*Tcr)+" Hex(@*Tcr\Va[0])="+Hex(@*Tcr\Va[0])
For jj=0 To 256 
  Debug "jj="+Str(jj)+" Tpa\va(jj)="+Str(Tpa\VA(jj))+ " *Tcr\vw[jj]="+Str(*Tcr\Vw[jj])
Next
ReDim Tpa\VA(0); Remise à zero de la première méthode pour tester la troisième méthode 
Mem_Tpa=Tpa
Debug "******** troisième méthode d'allocation dynamique avec bidouille  par allocatememory sur tableau type Tpa !!! ****************"
*TTpa=AllocateMemory(2048)
PokeL(Tpa,*TTpa) ; Bidouille permettant une allocatememory() sur un tableau mais attention conserver l'adresse d'origine Mem_Tpa
For kk=0 To 256 
  Debug "kk="+Str(kk)+" Tpa\va(kk)="+Str(Tpa\VA(kk))+ " *Tcr\vw[kk]="+Str(*Tcr\Vw[kk])
Next
Debug "*******Il me reste à trouver une quatrième méthode d'allocation dynamique avec redim sur une structure type pointeur *********"
Avez-vous une idée pour allouer dynamiquement une zone de type *Tcr\xx[y] avec ReDim
A+

Re: Allocation Dynamique sur différentes structures

Publié : mer. 03/oct./2012 11:11
par Fred
Tu peux utiliser InitializeStructure()

Re: Allocation Dynamique sur différentes structures

Publié : mer. 03/oct./2012 11:45
par PAPIPP
Merci Fred
Mais je n'ai pas de Pb d'initialisation mais bien un Pb d'allocation dynamique
Syntax
InitializeStructure(*Pointeur, Structure)

Description

InitializeStructure initialise la zone mémoire structurée. C'est particulièrement utile quand la structure contient des tableaux dynamiques, des listes ou des maps qui doivent être allouées en interne par PureBasic. 'Structure' est le nom de la structure qui sera utilisée pour effectuer l'initialisation. Il n'y a pas de contrôle pour s'assurer que la zone mémoire est bien du type 'Structure' spécifié, donc il est impératif de manipuler cette commande avec précaution.
Exemple

Structure People
Name$
Age.l
List Friends.s()
EndStructure

*Student.People = AllocateMemory(SizeOf(People)) ; ==> allocation avant initialisation
InitializeStructure(*Student, People)

; Now the list is ready to use
;
AddElement(*Student\Friends())
*Student\Friends() = "John"

AddElement(*Student\Friends())
*Student\Friends() = "Yann"

; Print out the list content
;
ForEach *Student\Friends()
Debug *Student\Friends()
Next


Re: Allocation Dynamique sur différentes structures

Publié : mer. 03/oct./2012 12:00
par Fred
Je sais pas ce que tu veux faire, mais d'apres ton code, t'as besoin d'un initializestructure():

Code : Tout sélectionner

Structure S_X_cr ; S comme structure X comme dimension inconnue et cr comme crochet []
  StructureUnion
    VA.a[0]   ; ascii
    VB.b[0]   ; byte
    VC.c[0]   ; character
    VS.s{1}[0]; String 1 Byte
    VS2.s{2}[0]; String 2 Bytes
    VS3.s{3}[0]; String 3 Bytes
    VS4.s{4}[0]; String 4 Bytes
    VS8.s{8}[0]; String 8 Bytes
    Vu.u[0]   ; unicode
    Vw.w[0]   ; word
    Vl.l[0]   ; long
    Vi.i[0]   ; integer
    Vq.q[0]   ; quad
    Vf.f[0]   ; float
    Vd.d[0]   ; double
  EndStructureUnion
EndStructure
Structure S_X_pa ;  S comme structure X comme dimension inconnue et pa comme parenthèse ()
  StructureUnion
    Array VA.a(0)   ; ascii
    Array VB.b(0)   ; byte
    Array VC.c(0)   ; character
    Array VS.s{1}(0);  String 1 Byte
    Array VS2.s{2}(0); String 2 Bytes
    Array VS3.s{3}(0); String 3 Bytes
    Array VS4.s{4}(0); String 4 Bytes
    Array VS8.s{8}(0); String 8 Bytes
    Array Vu.u(0)   ; unicode
    Array Vw.w(0)   ; word
    Array Vl.l(0)   ; long
    Array Vi.i(0)   ; integer
    Array Vq.q(0)   ; quad
    Array Vf.f(0)   ; float
    Array Vd.d(0)   ; double
  EndStructureUnion
EndStructure

Structure com_cr_pa
  StructureUnion
    cr.S_X_cr
    pa.S_X_pa
  EndStructureUnion
EndStructure
; Structure com_pa_cr
;   StructureUnion
;     pa.S_X_pa
;     cr.S_X_cr
;   EndStructureUnion
; EndStructure

Define *Tcr.S_X_cr,*Tpa.S_X_PA,Tpa.S_X_pa,Tcr.S_X_cr
MAX=256
; ****  allocation dynamique
Debug "*****  Première méthode d'allocation dynamique avec ReDim Tpa\VA(2048) sur tableau"
ReDim Tpa\VA(2048); Première méthode d'allocation dynamique avec redim sur tableau
; ReDim Tcr\VA[1024]; erreur de syntaxe donc impossibilité d'allouer dynamiquement par cette méthode
Debug "*****  Deuxième méthode d'allocation dynamique avec allocatememory sur un pointeur"

*Tcr=AllocateMemory(2048)
*Tpa=AllocateMemory(2048); instruction permettant l'allocation dynamique mais impossibilité d'exploiter cette zone

; Necessaire
InitializeStructure(*Tpa, S_X_PA) 
ReDim *Tpa\VA(256)




For i=0 To 256
  tpa\VA(i)=i
  *Tcr\Vw[i]=i*2
  *Tpa\VA(i)=i*3 ; impossible de faire fonctionner cette instruction
Next
Debug "hex(Tpa)="+Hex(Tpa)+" Hex(@Tpa\VA(0)]="+Hex(@Tpa\VA(0))+" Hex(*Tcr)="+Hex(*Tcr)+" Hex(@*Tcr\Va[0])="+Hex(@*Tcr\Va[0])
For jj=0 To 256
  Debug "jj="+Str(jj)+" Tpa\va(jj)="+Str(Tpa\VA(jj))+ " *Tcr\vw[jj]="+Str(*Tcr\Vw[jj])
Next
ReDim Tpa\VA(0); Remise à zero de la première méthode pour tester la troisième méthode
Mem_Tpa=Tpa
Debug "******** troisième méthode d'allocation dynamique avec bidouille  par allocatememory sur tableau type Tpa !!! ****************"
*TTpa=AllocateMemory(2048)
PokeL(Tpa,*TTpa) ; Bidouille permettant une allocatememory() sur un tableau mais attention conserver l'adresse d'origine Mem_Tpa
For kk=0 To 256
  Debug "kk="+Str(kk)+" Tpa\va(kk)="+Str(Tpa\VA(kk))+ " *Tcr\vw[kk]="+Str(*Tcr\Vw[kk])
Next
Debug "*******Il me reste à trouver une quatrième méthode d'allocation dynamique avec redim sur une structure type pointeur *********"
Les tableaux statiques avec [] ne peuvent pas etre redimensionnés (d'où leurs noms).

Re: Allocation Dynamique sur différentes structures

Publié : mer. 03/oct./2012 23:21
par PAPIPP
Merci Fred
A+