Portée de variable et recursivité

Ceubex Messages postés 72 Date d'inscription mercredi 5 juillet 2006 Statut Membre Dernière intervention 11 janvier 2023 - 17 janv. 2010 à 17:50
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 19 janv. 2010 à 14:10
Bonjour,

J'ai un problème avec une fonction recursive de ce style

sub mafonction(byval liste as liste(of point))
dim copie as new liste(of point)
for i as integer=0 to liste.Count-1
 copie=liste
 copie.Add(liste(i))
 mafonction(copie)
next
end sub

Le soucis c'est que les variables donnent n'importe quoi. Tout ce comporte comme si liste et copie étaient des variables public et du coup dans le for quand i passe pas exemple à 1, je ne retouve pas la même valeur de liste que lorsque i était à 0

10 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 janv. 2010 à 18:32
salut,

faudrait commencer par nous montrer le vrai code

dim string as string ne passera pas trop
donc LIST as LIST ne serait pas plus souhaitable

pas plus que LISTE(of....), à moins que LISTE soit un type perso??

enfin, faire de la récursivité pourquoi pas, mais il faut être certain de l'utilité, quel est ton but ici?

parce que de la récursivité pour un RETOUR ok, mais là c'est une procédure, et BYVAL
donc aucun retour...

tu veux quoi et pourquoi?

[hr]
0
Ceubex Messages postés 72 Date d'inscription mercredi 5 juillet 2006 Statut Membre Dernière intervention 11 janvier 2023
17 janv. 2010 à 18:43
Oui désolé, c'est pas liste(of point) mais list(of point).
Ce que je vais faire est un peut compliqué, ont créer des liste de point à partir de points de propositions pour créer des trajectoires d'objectifs à atteindre par un petit robot.
Bref, de toute façon on s'en fiche un peu de la génèse de projet. Je sais que la recursivité est incontournable. Tout ce que je veux savoir c'est savoir comment recuperer mes variables.

Le code original contient des éléments exterieurs et si je commence à tout expliquer j'en ai pour 3 heures et 3 pages de codes à mettre. Mais cette exemple traduit vraiment mon problème
0
Ceubex Messages postés 72 Date d'inscription mercredi 5 juillet 2006 Statut Membre Dernière intervention 11 janvier 2023
17 janv. 2010 à 18:51
Disons que le code est

    Sub mafonction(ByVal liste As List(Of Point))
        Dim copie As New List(Of Point)
        For i As Integer = 0 To liste.Count - 1
            copie = liste
            copie.Add(liste(i))
            mafonction(copie)
        Next
    End Sub
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 janv. 2010 à 19:05
il devrait bien y avoir un compromis entre 3 pages et rien du tout mais comme tu veux

dans ce cas tu as la réponse :
soit tu fais une FUNCTION (pas une SUB nommée fonction), et là à toi de voir ce qu'elle retourne (cf mystère de la genèse), soit tu fais une PROCéDURE (comme maintenant, mais avec un nom plus approprié) et dans ce cas tu dois passer ta LIST par RéFéRENCE (et non comme ici par VALEUR)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ceubex Messages postés 72 Date d'inscription mercredi 5 juillet 2006 Statut Membre Dernière intervention 11 janvier 2023
17 janv. 2010 à 20:05
ok j'ai remplacé byval par byref.
Le problème est toujours là
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 janv. 2010 à 11:42
j'ai du mal a imaginer le but de ton code.

As New List(Of Point)

New inutile ici, puisque derrière tu fais :

copie = liste

du coup, les deux manipulent au final la même liste (tu n'a pas cloné la liste)

c'est une histoire sans fin, ta boucle, là, non ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
Ceubex Messages postés 72 Date d'inscription mercredi 5 juillet 2006 Statut Membre Dernière intervention 11 janvier 2023
19 janv. 2010 à 13:27
En désespoir de cause j'ai posté ce message sur un autre forum. Je n'ai eu qu'une réponse et c'était la bonne :
copie=New List(Of Point)(liste)
Cordialement...
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 janv. 2010 à 13:36
"desespoir de cause"
que ne faut il pas lire !

la réponse en question, je te l'avais donnée... je ne code pas en .Net, je pouvais pas affiner au point de te donner la rponse toute machée.

a savoir qu'en faisant copie = liste
tu ne clonait pas ta liste, tu faisait juste qu'utiliser une seconde variable pour parler de la même liste...

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 janv. 2010 à 13:43
poser ta question sur n forums, ok.

[www.developpez.net/forums/d864125/dotnet/visual-basic-net/windows-forms/portee-variable-recursivite/ www.developpez.net/forums/d864125/dotnet/visual-basic-net/windows-forms/portee-variable-recursivite/]

[www.clubic.com/forum/programmation/portee-de-variable-et-recursivite-id695368-page1.html www.clubic.com/forum/programmation/portee-de-variable-et-recursivite-id695368-page1.html]

www.forum.moteurprog.com/visual-basic/forum-msg-36825-1.htm

mais pour au final n'avoir de réponse convenable que sur un (heu, non, deux), soit ailleurs ce ne sont que de gros branques, soit ta question n'est pas claire du tout ^^

après, je te laisse seul juge de l'utilité d'une telle fonction.
Pour moi elle me semble toujours un peu obscure.

en effet, outre le fait que je ne lui voit pas de fin ; qu'as tu obtenu en sortant de ta boucle ? Après le premier appel a ta fonction ? (a moins que nous ne voyons là qu'un extrait du code de fonction)



Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
19 janv. 2010 à 14:10
aller on simplifie les types juste pour voir à quel point la question est bien posée :

sub setI(byval i as integer)
  dim j as integer = i
  setI j 
end sub


comme si nos machines n'avaient pas déjà assez d'informations à traiter...
0
Rejoignez-nous