Adresse des Map / List / Array

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Adresse des Map / List / Array

Message par graph100 »

Le problème ne se pose peut-être pas pour les Array, cependant pour les listes et les map, on ne peux pas récupérer leur "adresse".
Seulement l'adresse de l'élément courant.

C'est un problème dans le cas suivant :

Code : Tout sélectionner

Structure bla
	Map *mon_test.POINT()
EndStructure


NewMap test.POINT()

*adr.bla\mon_test() = test()

le but de ce code exemple est d'assigner la map dans la structure pour un accès ultérieur. Ce serait le même problème pour une liste.
Une procédure permet de passer des map, list et array en paramètres, j'aimerais que ces fonctionnalités soient étendues pour prendre en compte le cas que je viens de souligner.

pour le moment le seul moyen d'arriver à mes fin est le suivant :

Code : Tout sélectionner

Structure bla_maitre
	Map mon_test.POINT()
EndStructure

Structure bla
	a.l
	b.l
	
	*map_mon_test.bla_maitre
EndStructure


InitializeStructure(variable.bla_maitre, bla_maitre)

variable\mon_test("YO")\x = 2
variable\mon_test("YO")\y = 5


Define adr.bla
adr\map_mon_test = @variable


Debug adr\map_mon_test\mon_test("YO")\y
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Adresse des Map / List / Array

Message par nico »

Tu peux faire comme ceci aussi:

Code : Tout sélectionner

*pointer.Point = FindMapElement(variable\mon_test(), "YO")
Debug *pointer\y
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Adresse des Map / List / Array

Message par graph100 »

non.

La différence est que tu accèdes directement à l'adresse d'un élément.
Le but du code que j'ai posté est d'obtenir l'adresse de la MAP dans sa globalité, de l'objet map pour pouvoir l'utiliser ensuite.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Adresse des Map / List / Array

Message par PAPIPP »

Bonjour Graph_100

et comme cela

Code : Tout sélectionner

NewMap TEST1.POINT()  
	test1("GH")\x=2 
	test1()\x=5 
	Debug " **** ADRESSES MAP" 
	Debug TEST1()
; 	Debug TEST1()-SizeOf(POINT) 
	Debug @test1("GH")\x 
	Debug @test1()\y 
	 
	NewList LISTE.POINT() 

	AddElement(LISTE()) 
	
	LISTE()\x=4 
	LISTE()\Y=9 
	Debug " **** ADRESSES LISTE" 
	 
	Debug liste() 
	Debug @liste()\x 
	Debug @liste()\Y 
			 
A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Adresse des Map / List / Array

Message par PAPIPP »

Bonjour à tous
Je viens de regarder le généré ASM avec l'instruction copymap(map1(),map2())
Je trouve des différences entre toutes ces valeurs d'adresses

Code : Tout sélectionner

NewMap TEST1.POINT()
NewMap TEST2.POINT()
test1("GH")\x=2
test1()\x=5
Debug " **** ADRESSES MAP"
Debug TEST1()
; 	Debug TEST1()-SizeOf(POINT)
Debug @test1("GH")\x
Debug @test1()\y
CopyMap(TEST1(),TEST2())
Debug " **** ADRESSES MAP"
Debug TEST2()
; 	Debug TEST2()-SizeOf(POINT)
Debug @test2("GH")\x
Debug @test2()\y
Define ATEST1.l , ATEST2.l 
; Autre solution à partir du généré ASM m_TEST1 adresse de la MAP TEST1 et m_TEST2 adresse de la MAP TEST2

!mov  EAX ,dword [m_TEST1]
!mov   dword [v_ATEST1], EAX
!mov  EAX ,dword [m_TEST2]
!mov   dword [v_ATEST2], EAX

Debug ATEST1
Debug ATEST2

; Copie du généré  ASM 
; ; CopyMap(TEST1(),TEST2())
;   PUSH   dword [m_TEST2]
;   PUSH   dword [m_TEST1]
;   CALL  _PB_CopyMap@8
; ; Debug " **** ADRESSES MAP"
; ; Debug TEST2()
; ; 
; ; Debug @test2("GH")\x
; ; Debug @test2()\y
; ; Define ATEST1.l , ATEST2.l 
; ; 
; ; 
; ; !mov  EAX ,dword [m_TEST1]
; MOV  EAX ,dword [m_TEST1]
; ; !mov   dword [v_ATEST1], EAX
; MOV   dword [v_ATEST1], EAX
; ; !mov  EAX ,dword [m_TEST2]
; MOV  EAX ,dword [m_TEST2]
; ; !mov   dword [v_ATEST2], EAX
; MOV   dword [v_ATEST2], EAX
; ; 
; ; Debug ATEST1
; ; Debug ATEST2
; 
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Adresse des Map / List / Array

Message par falsam »

Les bots ont au moins un intérêt : Celui de réveiller des sujets enterrés depuis plus d'un an :)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Demivec
Messages : 90
Inscription : sam. 18/sept./2010 18:13

Re: Adresse des Map / List / Array

Message par Demivec »

falsam a écrit :Les bots ont au moins un intérêt : Celui de réveiller des sujets enterrés depuis plus d'un an :)
:)


graph100:

Ma tentative:

Code : Tout sélectionner

Structure map_POINT
  Map mon_map.POINT()
EndStructure   

Global NewList map_POINTs.map_POINT()

Procedure create_new_Map_POINT_addresses(x.i = 1)
  Protected i, compter
  
  For i = 1 To x
    If AddElement(map_POINTs())
      compter + 1
    EndIf
  Next
  
  ProcedureReturn compter
EndProcedure

Procedure delete_Map_POINT(*x.map_POINT)
  If ListSize(map_POINTs()) > 0
    ChangeCurrentElement(map_POINTs(), *x)
    DeleteElement(map_POINTs())
  EndIf
EndProcedure


Define i, k$, x

If create_new_Map_POINT_addresses(6)
  ;créer des données aléatoires
  x = ListSize(map_POINTs()) ; x > 0
  For i = 1 To 5 * x
    SelectElement(map_POINTs(), Random(x - 1))
    k$ = Chr(Random(25) + 'A') + Chr(Random(25) + 'A')
    map_POINTs()\mon_map(k$)\x = Random(49, 0)
    map_POINTs()\mon_map()\y = Random(100, 50)
  Next


  ForEach map_POINTs()
    Debug "Map Addresse: " + @map_POINTs()
    
    ForEach map_POINTs()\mon_map()
      Debug "  '" + MapKey(map_POINTs()\mon_map()) + "': " + map_POINTs()\mon_map()\x + ", " + map_POINTs()\mon_map()\y
    Next
  Next
  
  
  Debug "-------------------------"
  Define *adr.map_POINT
  
  SelectElement(map_POINTs(), Random(ListSize(map_POINTs()) - 1))
  *adr.map_POINT = @map_POINTs()
  

  ;supprimer un élément
  If MapSize(*adr\mon_map()) > 0
    ResetMap(*adr\mon_map())
    NextMapElement(*adr\mon_map())
    DeleteMapElement(*adr\mon_map())
  EndIf
  
  ;créer nouvel élément
  *adr\mon_map("crayon")\x = 1001: *adr\mon_map()\y = 2001
  
  Debug "Map Addresse: " + *adr
  ForEach *adr\mon_map()
    Debug "  '" + MapKey(*adr\mon_map()) + "': " + *adr\mon_map()\x + ", " + *adr\mon_map()\y
  Next
  
EndIf
@:édition: Merci à Ollivier pour la correction de ma grammaire.
Dernière modification par Demivec le sam. 25/avr./2015 1:13, modifié 2 fois.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Adresse des Map / List / Array

Message par Ollivier »

"Ma tentative". (Le suffixe "*ive" indique un féminin comme "*tion")

(For objects, ideas and all that's not a person)
Langue anglaise : 1 genre (its answer)
Langue française : 2 genres (masculin, féminin)
Langue allemande : 3 genres (masculin, féminin et neutre)

(Lots of foreigners say french language is difficult. )

Merci beaucoup Demivec pour ton double effort:
- Le 1er de proposer des réponses techniques
- Le 2nd de traduire

Don't worry: french online press write worse than you.

Merci à Papipp aussi évidemment.
Demivec
Messages : 90
Inscription : sam. 18/sept./2010 18:13

Re: Adresse des Map / List / Array

Message par Demivec »

Ollivier a écrit :Don't worry: french online press write worse than you.
Merci Ollivier. :oops: :)
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Adresse des Map / List / Array

Message par graph100 »

Ahah ! Merci Rhiannnna.

Ca vous a fait réfléchir du coup :lol:
Sinon, je suis plus trop présent, premier taff oblige :roll:
Pis avec le taff je nage dans le javascript et les web tech, donc PB c'est pas optimal (j'essaye de bien comprendre tout ça et ensuite peut-être Spriderbasic)
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre