Page 1 sur 1

Pointeur sur une liste et non liste de pointeurs...

Publié : lun. 26/juil./2010 20:40
par jihem49fr
Bonjour

Le second exemple du code ci-dessous ne fonctionne pas. Il illustre ce que j'essaie vainement de faire.
Comme pour l'exemple avec la chaîne (qui fonctionne très bien), je souhaite mettre un pointeur vers une liste dans ma structure et le récupérer pour manipuler ma liste. Comment obtenir un pointeur sur la liste ? Comment formaliser un pointeur sur liste ?

Code : Tout sélectionner

NewList *truc.type() -> crée un liste de pointeur et n'est pas un pointeur sur la liste
Pour "NewList tab.itm()", @tab() renvoie un pointeur sur l'élément courant et pas la liste depuis @tab est une variable qui n'a rien à voir avec tab.itm()... Au secours !!!

Cordialement,
jihem


Structure itm
  StructureUnion
    ptr.q
    *str.s
    List *lst.itm()
  EndStructureUnion
EndStructure

; met un pointeur sur une chaine et récupère la chaine, via ma structure itm <=> *str=@"TEST" 
me.itm
me\ptr=@"Test"
Debug(me\str)

NewList tab.itm()
AddElement(tab())
tab()\ptr=@"Un"
AddElement(tab())
tab()\ptr=@"Deux"
AddElement(tab())
tab()\ptr=@"Trois"

; met un pointeur sur la liste et récupère la liste
me\ptr=@tab
ForEach me\lst()
  Debug(me\lst()\str)  
Next
Debug("---")

Re: Pointeur sur une liste et non liste de pointeurs...

Publié : lun. 26/juil./2010 22:01
par djes
Premier post, et tu parles de pointeurs... Tu es sûr de maîtriser les listes de façon normale, d'abord? On n'est pas toujours obligé d'utiliser les pointeurs! Et puis, mets ton code dans les balises

Code : Tout sélectionner

 si possible, en cliquant sur le petit bouton au dessus :)

Re: Pointeur sur une liste et non liste de pointeurs...

Publié : mar. 27/juil./2010 7:12
par jihem49fr
djes a écrit :Premier post, et tu parles de pointeurs... Tu es sûr de maîtriser les listes de façon normale, d'abord? On n'est pas toujours obligé d'utiliser les pointeurs! Et puis, mets ton code dans les balises "code" si possible, en cliquant sur le petit bouton au dessus :)
Les pointeurs, c'est une habitude (plus de trente ans de C). Je pense maîtriser les listes. Le modèle arborescent à mettre en oeuvre est doté de références vers lui-même. Il ne peut efficacement se représenter qu'à l'aide de pointeur. J'ai trouvé un moyen de disposer d'un pointeur vers ma liste. Il suffit de l'inclure dans une structure (voir code ci-après).

Il ne me reste plus qu'à faire de même pour le type map, à ajouter un identifiant qualifiant la nature de l'entité stockée (entier, chaîne, list, map) et à habiller le tout de getter/setter.

Code : Tout sélectionner

Structure itm
  StructureUnion
    ptr.q
    *str.s
    *lst.itm_lst
  EndStructureUnion
EndStructure

Structure itm_lst
  List lst.itm()  
EndStructure

; stocke une chaîne et la récupère
me.itm
me\ptr=@"Test"
Debug(me\str)

; stoke un entier et le récupère
me\ptr=25
Debug(me\ptr)

tab.itm_lst
AddElement(tab\lst())
tab\lst()\ptr=@"Un"
AddElement(tab\lst())
tab\lst()\ptr=@"Deux"
AddElement(tab\lst())
tab\lst()\ptr=@"Trois"

; stocke une liste et la récupère
me\ptr=@tab
ForEach me\lst\lst()
  Debug(me\lst\lst()\str)  
Next

Debug("---")
Question annexe : PB dispose-t-il d'une fonction de copie de structure récursive ?
Pour cloner une structure existante et les entités pointées (et ne pas bêtement recopier les pointeurs qui désigneraient les mêmes entités à partir de la structure et de son clone)

Re: Pointeur sur une liste et non liste de pointeurs...

Publié : mar. 27/juil./2010 10:57
par comtois
Question annexe : PB dispose-t-il d'une fonction de copie de structure récursive ?
Pour cloner une structure existante et les entités pointées (et ne pas bêtement recopier les pointeurs qui désigneraient les mêmes entités à partir de la structure et de son clone)
Je ne sais pas ce que tu entends pas récursive, mais il existe une fonction de copie de structure --> CopyStructure()

autre possibilité

Code : Tout sélectionner

Define.point a, b

a\x = 34
a\y = 67

b = a

Debug b\x
Debug b\y
Dans ton cas c'est CopyStructure() qui conviendra ?

Re: Pointeur sur une liste et non liste de pointeurs...

Publié : mar. 27/juil./2010 15:31
par djes
Non, je ne pense pas qu'il y ait de procédure pour faire ça, il faudra que tu te la bricoles toi-même. En tous cas, bienvenue ;)

Re: Pointeur sur une liste et non liste de pointeurs...

Publié : mer. 28/juil./2010 18:16
par jihem49fr
djes a écrit :Non, je ne pense pas qu'il y ait de procédure pour faire ça, il faudra que tu te la bricoles toi-même. En tous cas, bienvenue ;)
Merci à tous. Je vais me bricoler un procédure de "clonage" (pour que l'original et le clone n'aient pas de référence commune).

Je trouve très déroutant le fait que les écriture *p et p soient sans relation. Dans le premier cas, il s'agit d'un pointeur mais sans aucune relation a avec p (sauf si l'on écrit *p=p, alors qu'en fait on s'attend plutôt a écrire *p=@p...).

Re: Pointeur sur une liste et non liste de pointeurs...

Publié : mer. 28/juil./2010 20:12
par comtois
jihem49fr a écrit :
djes a écrit :Non, je ne pense pas qu'il y ait de procédure pour faire ça, il faudra que tu te la bricoles toi-même. En tous cas, bienvenue ;)
Merci à tous. Je vais me bricoler un procédure de "clonage" (pour que l'original et le clone n'aient pas de référence commune).
Je ne comprends pas trop ce que tu cherches à faire, mais pour copier un tableau, une liste ou une map il existe des fonctions 'récursives' comme tu dis (voir CopyArray(); CopyList() ou CopyMap()).
Si tu veux juste copier une structure sans référence commune, la fonction CopyStructure() est adaptée à ton besoin.
Je trouve très déroutant le fait que les écriture *p et p soient sans relation. Dans le premier cas, il s'agit d'un pointeur mais sans aucune relation a avec p (sauf si l'on écrit *p=p, alors qu'en fait on s'attend plutôt a écrire *p=@p...).
En effet la gestion des pointeurs diffère légèrement du C, tu t'y feras vite.

J'ai la comprenote difficile, mais là aussi je ne comprends pas ce que tu entends par relation entre *p et p ? Effectivement *p et p sont deux variables distinctes.

*p=@p correspond à la bonne syntaxe pour récupérer l'adresse de p.

ou mieux

Code : Tout sélectionner

p = 56
*p.integer = @p 
Debug *p\i  ;(tu retrouves bien la valeur de p)

Re: Pointeur sur une liste et non liste de pointeurs...

Publié : mer. 28/juil./2010 20:38
par djes
Il veut dire par exemple pouvoir copier en une seule instruction plusieurs listes structurées liées par des pointeurs (définis dans les structures). C'est possible? Ca fait longtemps que je n'ai pas vraiment codé en PB...

Re: Pointeur sur une liste et non liste de pointeurs...

Publié : mer. 28/juil./2010 21:09
par comtois
oui c'est ce que fait CopyStructure() : copie une zone de mémoire structurée vers une autre. C'est particulièrement utile lors de l'utilisation de mémoire dynamique pour stocker la structure. Chaque champ de la structure sera dupliqué, y compris les tableaux dynamiques, les listes et les maps.

C'est l'exemple de la doc, ici c'est une map imbriquée dans une structure, mais ça marche aussi avec une list ou un array.

Code : Tout sélectionner

  Structure People
    Name$
    LastName$
    Map Friends$()
    Age.l
  EndStructure

  Student.People\Name$ = "Paul"
  Student\LastName$ = "Morito"
  Student\Friends$("Tom") = "Jones"
  Student\Friends$("Jim") = "Doe"
  
  CopyStructure(@Student, @StudentCopy.People, People)
  
  Debug StudentCopy\Name$
  Debug StudentCopy\LastName$
  Debug StudentCopy\Friends$("Tom")
  Debug StudentCopy\Friends$("Jim")
Maintenant il cherche sûrement à faire quelque chose de plus complexe avec ses pointeurs sur list.

Re: Pointeur sur une liste et non liste de pointeurs...

Publié : mer. 28/juil./2010 21:26
par djes
Au temps pour moi, merci Comtois :)
Il est bien ce langage ;)