Page 1 sur 1

Structure et Dim

Publié : mer. 17/juin/2009 22:34
par Cool Dji
Hello world :wink: ,

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 :roll:
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
Image
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 8O . 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 :oops:
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 8O

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 8)

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 8)
Well, les images des Bitmap Brothers donnent de l'allure à MadFire, chuis pas chur qu'avec mes dechins à moi che choit chi clache :lol:

Yeah, ici à sa façon chacun à quelque chose de classe 8)

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                                                      ;
;                                                           ;
;===========================================================;