Page 1 sur 1
Structure et Dim
Publié : mer. 17/juin/2009 22:34
par Cool Dji
Hello world

,
J'ai cherché et point trouvé la possibilité de mettre un tableau redimensionnable dans une structure :
Code : Tout sélectionner
Structure Mechantcourbe
courbesize.i
courbex.i[1]
courbey.i[1]
EndStructure
Global Mechantcourbe.mechantcourbe(nombredemechants)
For i=1 To nombredemechants
Dim mechantcourbe(i)\courbex(la valeur que je veux)
Dim mechantcourbe(i)\courbey(la valeur que je veux)
Next
En définitive, je veux pouvoir paramétrer à tout moment la taille des tableaux courbex et courbey sachant que le nombre de mechantcourbe peut varier également à tout moment.
J'ai testé la possibilité de prendre des tableaux sans structures mais je n'arrive pas à modifier de manière indépendante le nombre de tableaux sans modifier la taille des tableaux déjà existants.
En Delphi, si j'avais :
Mechantcourbe[1,3]=[7,4,3]
Mechantcourbe[2,1]=[5]
Mechantcourbe[3,5]=[5,3,6,8,1]
je pouvais à tout moment faire
redim Mechantcourbe[2]=3
et remplir Mechantcourbe[2,3]=[5,8,4]
Bref, je suis un peu perdu
Merci à vous
ps : c'est pour un éditeur de méchant dans Mad Fire !!
Publié : mer. 17/juin/2009 23:19
par Ollivier
Je suis certain que tu te prends la tête inutilement!! Pourquoi? Je ne peux pas savoir! A mon avis, prends une feuille et structure bien les caractéristiques de tes objets, mais l'utilité d'un objet dont les caractéristiques sont modifiées ainsi me semble nulle.
Cependant, si tu en as besoin, voici quand même un exemple de manip de ce qu'il te faut.
Code : Tout sélectionner
Structure D1Info
A.I[1 << 4]
EndStructure
Structure D2Info
A.D1Info[1 << 4]
EndStructure
Structure D3Info
A.D2Info[1 << 4]
EndStructure
Structure D4Info
A.D3Info[1 << 4]
EndStructure
Structure MultiInfo
StructureUnion
A0.I[1 << 4]
A1.D1Info[1 << 4]
A2.D2Info[1 << 4]
A3.D3Info[1 << 4]
A4.D4Info[1 << 4]
EndStructureUnion
EndStructure
*X.MultiInfo = AllocateMemory(1 << 20)
*X\A0[1] = 4
*X\A1[1]\A[2] = 5
*X\A2[2]\A[0]\A[1] = 3
*X\A3[0]\A[1]\A[2]\A[3] = 2
*X\A4[3]\A[1]\A[0]\A[2]\A[4] = -1
Publié : mer. 17/juin/2009 23:30
par Ollivier
A titre indicatif, cinq dimensions dans ton tableau, c'est n puissance 5 cellules mémoire à allouer. Autrement tu satures plusieurs giga pour peu de choses. Non, j'essaie de comprendre mais il manque quelques précisions de ta part pour piger le truc...
Je pense que la syntaxe de Delphi ne signifie pas la même chose sous PB.
Si tu dois gérer des infos de manière "élastique", c'est à dire qu'une cellule contient une info, une autre, cinq infos, etc... je pense qu'il te faut utiliser les chaînes.
Code : Tout sélectionner
Structure MechantInfo
CX.S
CY.S
EndStructure
Global Dim Mechant.MechantInfo(ValeurIni)
Global Dim Mechant.MechantInfo(NouvelleValeur)
Mechant(5)\CX = "5,17,22.5,3,14"
Mais bon, il y a d'autres solutions. N'hésite pas à expliquer le truc sinon ça va pas être possible de te montrer la prog la plus simple.
Publié : mer. 17/juin/2009 23:56
par kernadec
bonsoir
je pencherais plutot pour une solution newlist
Code : Tout sélectionner
Structure Mechantcourbe
courbesize.i
courbex.i
courbey.i
EndStructure
Global NewList mechantcourbe.mechantcourbe()
For a=0 To 5
For i=0 To Random(10)
AddElement(mechantcourbe())
mechantcourbe()\courbesize=Random(45)
mechantcourbe()\courbex=Random(200)
mechantcourbe()\courbey=Random(300)
Next i
ResetList(mechantcourbe())
; Affiche tous les éléments de la liste
While NextElement(mechantcourbe())
Debug Str(i)+"T:"+Str(mechantcourbe()\courbesize)
Debug Str(i)+"X:"+Str(mechantcourbe()\courbex)
Debug Str(i)+"Y:"+Str(mechantcourbe()\courbey)
Wend
Next a
Publié : jeu. 18/juin/2009 10:03
par kernadec
bonjour
dans la série ou sont passés les méchants ?...
cordialement
Code : Tout sélectionner
Structure Mechantcourbe
annuaire.s
courbesize.i
courbex.i
courbey.i
EndStructure
Global NewList mechantcourbe.mechantcourbe()
For a=0 To 5
LastElement(mechantcourbe())
For i=0 To Random(10)
AddElement(mechantcourbe())
mechantcourbe()\courbesize=Random(45)
mechantcourbe()\courbex=Random(200)
mechantcourbe()\courbey=Random(300)
;mechantcourbe()\annuaire=Str(a)+" * "+Str(i)+" n°"+Str(CountList(mechantcourbe())) ;PB420
mechantcourbe()\annuaire=Str(a)+" * "+Str(i)+" n°"+Str(ListSize(mechantcourbe())) ;PB430
Next i
Next a
ForEach mechantcourbe()
; Affiche tous les éléments de la liste
Debug mechantcourbe()\annuaire
Debug Str(a)+" * "+Str(i)+" T:"+Str(mechantcourbe()\courbesize)
Debug Str(a)+" * "+Str(i)+" X:"+Str(mechantcourbe()\courbex)
Debug Str(a)+" * "+Str(i)+" Y:"+Str(mechantcourbe()\courbey)
Next
Publié : jeu. 18/juin/2009 10:29
par djes
Des chaînes pour faire ça... ?
En PB, a priori, on ne peut pas faire de tableaux dynamiques dans une structure. Comme kernadec, je recommanderai de faire une liste chaînée, associée (avec un pointeur), soit à une autre liste chaînée, soit à une zone mémoire dynamique avec allocmem(). Quoique... En y réfléchissant, on pourrait pointer vers un tableau, qui lui serait dynamique. Y'a peut-être déjà ce genre d'exemples sur le forum.
Publié : jeu. 18/juin/2009 11:36
par Cool Dji
Merci Ollivier, Kernadec et Djes pour vos réponses,
Voilà ce que j'ai à l'écran pour l'instant

Dans un premier temps, j'avais fait un propre système de tableau dynamique avec une seule liste de coordonnées x,y et des pointeurs pour chaque courbe qui pointaient sur le début de la courbe dans cette longue liste de coordonnées. J'avais le soucis de devoir tout décaler cette liste si je voulais enlever ou ajouter des coordonnées à l'interieur de cette liste. D'ou ma question sur le forum car je ne trouvais pas de solution
Je vais creuser vos pistes et voir quelle solution répond le mieux à mes besoins. Je me rends compte qu'il me reste encore beaucoup à découvrir sur PB pour mettre en oeuvre le concept

. J'utilisais beaucoup les tableaux multidimensionnels avec Delphi et j'ai encore le reflexe de m'appuyer la dessus pour mes algos...
Merci encore et à bientôt
Publié : jeu. 18/juin/2009 13:34
par Kwai chang caine
Au risque de me repeter, et de faire croire que j'suis toujours trop admiratif

Mais vous m'epater toujours avec vos supers belles images, et par la meme PB m'epate aussi quand je vois ce qu'il sait faire
J'aime pas les jeux et je fait que de l'utilitaire.....mais je dois avouer quand meme que faire un jeu, c'est vraiment la grande classe

Publié : jeu. 18/juin/2009 14:22
par Cool Dji
Kwai chang caine a écrit :je dois avouer quand meme que faire un jeu, c'est vraiment la grande classe

Well, les images des Bitmap Brothers donnent de l'allure à MadFire, chuis pas chur qu'avec mes dechins à moi che choit chi clache
Yeah, ici à sa façon chacun à quelque chose de classe

Publié : jeu. 18/juin/2009 14:45
par cha0s
ceci devrait peut être t'aider sa permet de faire des tableaux dynamique via pointeur.
Code : Tout sélectionner
;===========================================================;
; ;
; Code generated by Chronos ;
; ;
;===========================================================;
EnableExplicit ;Variable declaration enable
;===========================================================;
; ;
; Macro ;
; ;
;===========================================================;
;===========================================================;
; ;
; Constantes ;
; ;
;===========================================================;
;===========================================================;
; ;
; Structures ;
; ;
;===========================================================;
Structure Array
*ptr.i
number.i
EndStructure
;===========================================================;
; ;
; Variables ;
; ;
;===========================================================;
;===========================================================;
; ;
; Declare ;
; ;
;===========================================================;
Declare.i Array_CountElement(*this.Array)
Declare.i Array_SetElement(*this.Array,number.i,*Element.i)
Declare.i Array_AddElement(*this.Array,*Element.i)
Declare.i Array_FreeElement(*this.Array,number.i)
Declare.i Array_GetElement(*this.Array,number.i)
Declare.i Array_RemoveAll(*this.Array)
Declare.i Array_Free(*this.Array)
Declare.i New_Array()
;===========================================================;
; ;
; Procedures ;
; ;
;===========================================================;
Procedure.i Array_CountElement(*this.Array)
ProcedureReturn *this\number
EndProcedure
Procedure.i Array_SetElement(*this.Array,number.i,*Element.i)
If number>*this\number
*this\number=number
*this\ptr=ReAllocateMemory(*this\ptr,number*SizeOf(integer))
EndIf
PokeI(*this\ptr+(number-1)*SizeOf(integer),*Element)
EndProcedure
Procedure.i Array_AddElement(*this.Array,*Element.i)
Array_SetElement(*this,*this\number+1,*Element)
ProcedureReturn *this\number
EndProcedure
Procedure.i Array_FreeElement(*this.Array,number.i)
If *this\number=1
*this\number=0
Else
If number<*this\number
CopyMemory(*this\ptr+SizeOf(integer)*number,*this\ptr+SizeOf(integer)*(number-1),SizeOf(integer)*(*this\number-number))
EndIf
*this\number-1
*this\ptr=ReAllocateMemory(*this\ptr,*this\number*SizeOf(integer))
EndIf
EndProcedure
Procedure.i Array_GetElement(*this.Array,number.i)
If number<=*this\number
ProcedureReturn PeekI(*this\ptr+(number-1)*SizeOf(integer))
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.i Array_RemoveAll(*this.Array)
*this\number=0
*this\ptr=ReAllocateMemory(*this\ptr,1)
EndProcedure
Procedure.i Array_Free(*this.Array)
FreeMemory(*this\ptr)
FreeMemory(*this)
EndProcedure
Procedure.i New_Array()
Protected *this.Array
*this = AllocateMemory(SizeOf(Array))
*this\ptr=AllocateMemory(1)
*this\number=0
ProcedureReturn *this
EndProcedure
;===========================================================;
; ;
; Body ;
; ;
;===========================================================;