Page 1 sur 1

Manipuler une map par son adresse

Publié : mer. 09/nov./2016 18:51
par Torp
Hello tout le monde,

je voudrais savoir s'il est possible de une map structurée à partir de son adresse.
L'exemple ci-après n'a aucun sens car on pourrait passer la Map en paramètre de la procédure, mais c'est juste pour expliquer le truc...

Code : Tout sélectionner

Structure Valeurs
	Valeur.i
	txt.s
EndStructure

Structure Test
	Type.b
	Val.Valeurs
EndStructure

NewMap MyMap1.Test()
NewMap MyMap2.Test()

AddMapElement(MyMap1(), "Map1")
MyMap1()\Type = 1
MyMap1()\Val\txt  = "qqchose"
MyMap1()\Val\Valeur = 5

AddMapElement(MyMap2(), "Map2")
MyMap2()\Type = 2
MyMap2()\Val\txt  = "autre"
MyMap2()\Val\Valeur = 7

Procedure Traitement(Type.b)
	Shared MyMap1(), MyMap2()
	NewMap *pt.Test()
	
	Select Type
		Case 1
			*pt = @MyMap1()
		Case 2
			*pt = @MyMap2()
	EndSelect
	
	; Traitement
	ForEach *pt()
		Debug *pt()\Val\Valeur
	Next
EndProcedure

Traitement(MyMap1()\Type)
Le seul moyen que j'ai trouvé est d'encapsuler la map dans une structure, mais c'est lourdingue...

Code : Tout sélectionner

Structure Valeurs
	Valeur.i
	txt.s
EndStructure

Structure Test
	Type.b
	Val.Valeurs
EndStructure

Structure MaMap
	Map MyMap.Test()
EndStructure

Define M1.MaMap
Define M2.MaMap

AddMapElement(M1\MyMap(), "Map1")
M1\MyMap()\Type = 1
M1\MyMap()\Val\txt  = "qqchose"
M1\MyMap()\Val\Valeur = 5

AddMapElement(M2\MyMap(), "Map2")
M2\MyMap()\Type = 2
M2\MyMap()\Val\txt  = "autre"
M2\MyMap()\Val\Valeur = 7

Procedure Traitement(Type.b)
	Shared M1, M2
	*pt.MaMap
	
	Select Type
		Case 1
			*pt = @M1
		Case 2
			*pt = @M2
	EndSelect
	
	; Traitement
	ForEach *pt\MyMap()
		Debug *pt\MyMap()\Val\txt
	Next
EndProcedure

Traitement(M1\MyMap()\Type)
Merci

il est vraiment en mousse cet exemple...

Re: Manipuler une map par son adresse

Publié : mer. 09/nov./2016 20:18
par falsam
Je crains fort que ce soit le seul moyen.

Ton premier code ne fonctionne pas car ton pointeur ne pointe pas sur une map mais sur un élément dans une map en cours de lecture. N'ayant pas amorcer cette lecture, tu n'auras pas de résultat.

En fonction de ce que j'ai dit voila ton premier code modifié

Code : Tout sélectionner

Structure Valeurs
   Valeur.i
   txt.s
EndStructure

Structure Test
   Type.b
   Val.Valeurs
EndStructure

Global NewMap MyMap1.Test()
Global NewMap MyMap2.Test()

AddMapElement(MyMap1(), "Map1")
MyMap1()\Type = 1
MyMap1()\Val\txt  = "qqchose"
MyMap1()\Val\Valeur = 5

AddMapElement(MyMap2(), "Map2")
MyMap2()\Type = 2
MyMap2()\Val\txt  = "autre"
MyMap2()\Val\Valeur = 7

Procedure Traitement(Type.b)
   ;Shared MyMap1(), MyMap2()
   Protected *pt.Test
   
   Select Type
      Case 1
         *pt = @MyMap1()
      Case 2
         *pt = @MyMap2()
   EndSelect
   
   ; Traitement
   ;ForEach *pt()
    Debug *pt\Type
   ;Next
EndProcedure

Traitement(MyMap1()\Type)

Re: Manipuler une map par son adresse

Publié : jeu. 10/nov./2016 9:13
par Torp
Merci Falsam, Décidément sur tous les fronts :)
Je savais cela (j'avais dis que mon exemple n'était pas génial), mais j'ai tenté histoire de m'enlever le doute et d'essayer de trouver une solution là où il n'y en a à priori pas ;)