Page 1 sur 1

Liste comme argument d'une procedure

Publié : mer. 23/mai/2007 17:51
par hackotedelaplaque
Bonjour,

Après un break, mon projet de la rubrique jeu est bientôt fini et l'IA est bien au rendez vous.

Une petite question cependant qui pourrait me faire optimiser mon code.

Peux-ton manipuler une liste au sein d'une procédure prenant une liste comme argument ?

Ex : procedure ma_fonction(*maliste.liste)
for each *maliste
...
next

selectelement(*maliste,5)
...
endprocedure

J'imagine que ça n'est pas possible ? L'argument étant l'élément courant de la liste et non la liste elle-même...

Mais dans le doute je vous pose la question.

Merci.

Publié : mer. 23/mai/2007 18:02
par Progi1984
Depuis la V4, c'est possible :

Code : Tout sélectionner

; Listes chaînées et tableaux en paramètres  
  ;
  ; Liste chaînée 
  ;
  ;

  NewList Test.Point()

  AddElement(Test())
  Test()\x = 1
  AddElement(Test())
  Test()\x = 2

  Procedure DebugList(c.l, ParametreListe.Point())

    AddElement(ParametreListe())
    ParametreListe()\x = 3

    ForEach ParametreListe()
      MessageRequester("Liste", Str(ParametreListe()\x))
    Next
 
  EndProcedure

  DebugList(10, Test())

Publié : mer. 23/mai/2007 20:58
par hackotedelaplaque
Super merci !

Le problème venait de la structure maison de ma liste qui n'était pas spécifié.

Publié : mer. 23/mai/2007 21:25
par hackotedelaplaque
J'ai marqué le topic en résolu un peu trop rapidement.

En effet on peut passer depuis la v4 une liste en argument.
Mais il y a une grande différence qui dans mon cas pose problème.

Avant la v4 j'utilisais la technique des pointeurs pour passer ma liste.
La différence ?
Si dans ma procédure j'ai la commande deleteelement(ma_liste()), l'élément courant de la liste devient automatiquement l'élément suivant !
Ce qui n'est pas le cas en passant un pointeur en argument.

Publié : jeu. 24/mai/2007 7:17
par brossden
Il te suffit d'ajouter NextElement !!

Code : Tout sélectionner


NewList Test.POINT()
AddElement(Test())
Test()\x = 10
AddElement(Test())
Test()\x = 20

Procedure DebugList(c.l, ParametreListe.POINT())
  AddElement(ParametreListe())
  ParametreListe()\x = 35
  ForEach ParametreListe()
    MessageRequester("Liste", Str(ParametreListe()\x))
  Next
EndProcedure

Procedure DelElList(ParametreListe.POINT())
  FirstElement(ParametreListe())
  MessageRequester("Liste", Str(ParametreListe()\x))
  DeleteElement(ParametreListe())
  NextElement(ParametreListe())
  MessageRequester("Liste", Str(ParametreListe()\x))
EndProcedure

DebugList(10, Test())
DelElList(Test())

Publié : jeu. 24/mai/2007 17:41
par hackotedelaplaque
Nextelement non car je n'ai plus à travailler sur la liste après mon deleteelement().
Je dois juste sortir purement et simplement de la fonction. Ce n'est pas un gros travail.

Juste une dernière question sur le sujet : y'a t il des inconvénients à passer un pointeur en argument plutot que la liste en termes de performance ?