IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème de variable en référence dans une récursion


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Problème de variable en référence dans une récursion
    Bonjour,

    J'ai le problème suivant dans une macro qui est sensé renvoyer un chemin de N noeud pour un graphe donné (matrice d'adjacence en entrée).

    Mon problème est je pense plus technique qu'algoritmique.

    La macro marchait très bien avec des listes: une variable locale sensée conserver l'information du chemin parcouru à un niveau donné de récursion était évaluée en entrée de la fonction puis ressert plus loin au milieu des appels récursifs.

    J'ai souhaité gérer les chemins ensuite par des objets collection.
    Et cette même variable qui est évaluée à partir d'un item garde et update sa valeur au sein de chaque récurrence, comme si elle était passée en Byref!

    Ce qui ne me va pas tout ....!

    avant (marche):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cheminAnt = listeInt1(taillePrinc + 1)
    après (marche plus):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cheminAnt = listeInt.Item(listeInt.Count)
    comment forcer un "byval" ?

    Merci beaucoup pour vos conseils et aides.
    Dites moi s'il vous faut plus d'éléments.

    Thabris

  2. #2
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour,

    Il faut nous montrer ta façon d'alimenter ta collection.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Oui pas de souci voici le de la fonction qui récurse (la variable qui est modifiée et constitue la sortie est listeInt et est initialisée avant appel avec le premier noeud) :

    matriceGraph est la matrice d'adjacence
    noeudChemin le noeud depuis lequel on observe les adjacences
    ordre le nombre de nœuds restants à être parcouru
    limite est le nb de nœuds total à être parcouru

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    Sub listeCheminNoeud(ByVal noeudChemin As Integer, ByVal ordre As Single, ByRef matricegraph() As Single, ByRef listeInt As Collection, ByRef limite As Integer)
     
    Dim noeud       As Integer
    Dim noeudOK()   As Integer
    Dim taille      As Integer
    Dim i           As Integer
    Dim cheminAnt   As Integer
     
     
     
    taille = -1
    ReDim noeudOK(0)
     
    'pb sur valeur de cheminant qui est consevé d'un appel recusrif à l'autre ... Cette variable doit conserver, au sein de l'appel le dernier chemin
    'qui représente d'où on vient au sein de cet appel et dans tous les appels en cascade
    'comme noeud ok par exemple qui représente la liste des noeuds accessibles et doit bien rester local au sein de chaque recursion
     
    cheminAnt = (listeInt.Item(listeInt.Count))
     
     
    'boucle qui cherche tous les noeuds adajcents dans la matrice
    'et stock dans noeudOK()
     
    'test si le nombre de nœuds parcouru est encre inférieur à la taille demandée
     
    If limite > ordre Then
     
        For noeud = 0 To UBound(matricegraph, 1)
            If matricegraph(noeud, noeudChemin) = 1 Then
                taille = taille + 1
                ReDim Preserve noeudOK(taille)
                noeudOK(taille) = noeud
             End If
        Next noeud
     
     
    'si taille de noeudsOK() =0 alors pas de noeuds accessible adjacent = sortie d'appel récursif
    'sinon pour chaque noeuds adjacents on fait la récursion:
     
        If taille > -1 Then
            For i = 0 To taille
     
                'si le noeud adjacent est déja présent dans le parcours antérieur, alors on ne l'ajoute pas
                'mais on le parcours quand même car il reste peut-être des chemins accesibles depuis celui-ci
                'cette méthode provoquera des doublons mais assure le comptage des culs de sac et permet le rebours
                'on incrément pas l'ordre
    'testExist vérifie juste si le chiffre du noeuds est présent dans le nombre cheminAnt qui représente à chaque puissance de 10 l'ordre du chemin
     
                If testExist(noeudOK(i) + 1, cheminAnt) Then
     
                    'on casse la connection = on est dejà passer par là
                    matricegraph(noeudOK(i), noeudChemin) = 0
                    Call listeCheminNoeud(noeudOK(i), ordre, matricegraph, listeInt, limite)
     
                    'on la remet = la matrice est en byref!
                    matricegraph(noeudOK(i), noeudChemin) = 1
                Else
     
                    'si le noeud n'est pas présent, on l'ajoute, la puissance de 10 est incrémenté
     
                    matricegraph(noeudOK(i), noeudChemin) = 0
                    cheminAnt = cheminAnt + (noeudOK(i) + 1) * 10 ^ ordre
     
                    'imposible de modifier un élement de collection => remove et add
     
                    If listeInt.Count <> 0 Then
                        listeInt.Remove listeInt.Count
                    End If
     
                    listeInt.Add cheminAnt
     
     
                    'Debug.Print listeInt1(taillePrinc)
     
                    'ici on incrémente bien l'ordre
     
                    Call listeCheminNoeud(noeudOK(i), ordre + 1, matricegraph, listeInt, limite)
                    matricegraph(noeudOK(i), noeudChemin) = 1
                End If
     
            Next i
        Else
            'si il n'y a pas de noeuds accessible ici et que malgré tout l'ordre est toujours inférieur à l'ordre du chemin voulue,
            'c'est un mauvais chemin, on l'efface et on remonte en recursion on reprenant le cheminAntérieur de la récursion parente
            'sachant que le noeud où l'on est ici a bien ajouté avant et que l'on retire le chemin allé dans la matrice et pas le chemin retour
     
            listeInt.Remove listeInt.Count
     
        End If
     
    End If
     
    End Sub

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    merci bcp pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de récupération de texte dans une variable
    Par LeoBeutel dans le forum Cpcdos
    Réponses: 11
    Dernier message: 04/11/2014, 18h41
  2. Réponses: 2
    Dernier message: 14/09/2010, 16h39
  3. Réponses: 2
    Dernier message: 30/03/2009, 12h21
  4. Problème pour placer un chemin dans une variable
    Par steph70 dans le forum Tkinter
    Réponses: 2
    Dernier message: 06/03/2009, 17h48
  5. Réponses: 6
    Dernier message: 30/10/2007, 12h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo