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 récursivité fonction


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 19
    Points : 13
    Points
    13
    Par défaut problème récursivité fonction
    bonjour,
    voici ma fonction que je n'arrive pas à exécuter parcequ'il me met une erreur 'Espace pile insuffisant'. En fait il situe cet erreur quand je rappel la fonction pour faire quelque chose de récursif(en rouge dans le code).
    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
    Function optimum(nb_subch_tr, nb_bis_tr)
    
    'Option Explicit
    'Option Base 1
    
    Dim connect_width(4) As Integer, connect_length(4) As Integer
    Dim rect_width(4) As Integer       
    Dim rect_length(4) As Integer
    Dim i As Integer
    Dim N_DL_opt As Double
    Dim N_DL_max As Integer
    
    
    Dim j As Integer, jmax As Integer
    Dim max As Double
    Dim a As Integer, b As Integer
    max = rect_width(1) * rect_length(1)
    jmax = 1
    
    nb_subch_tr = Sheets("PHY").Range("C24").Value         
    nb_bis_tr = ((Sheets("PHY").Range("C40").Value) / 2) - map_width   rect_width(1) = 0
    rect_length(1) = 0
    N_DL_opt = 0
    
    Do
        'DLburst_cur = Sheets("Capacity").Range("J12").Value * N_DL
        N_DL = N_DL - 1
        For i = 1 To n Step 1
            If tabl(1, i) <= nb_subch_tr And tabl(2, i) <= nb_bis_tr Then
                While (nb_bis_tr - rect_width(i)) >= 0
                    rect_width(i) = rect_width(i) + tabl(1, i)
                    connect_width(i) = connect_width(i) + 1
                Wend
                While (nb_subch_tr - rect_length(i)) >= 0
                  rect_length(i) = rect_length(i) + tabl(2, i)
                   connect_length(i) = connect_length(i) + 1
                Wend
            End If
        
        Next i
    
        For j = 2 To n
            jmax = 1  
            If rect_width(j) * rect_length(j) > max Then
                max = rect_width(j) * rect_length(j)
                jmax = j
            End If
        Next j
      N_DL_opt = (rect_width(jmax) * rect_length(jmax)) / (tabl(1, jmax) * tabl(2, jmax))
        a = nb_subch_tr - rect_length(jmax)
        b = nb_bis_tr - rect_width(jmax)
        
    Loop While N_DL > (connect_length(jmax) * connect_width(jmax))
    
    N_DL = N_DL + 1
    N_DL_max = N_DL_opt
    
        While b > 0
           Call optimum(a, (nb_bis_tr - b))            N_DL_max = N_DL_max + N_DL_opt
        Wend
        While a > 0
            Call optimum(nb_subch_tr, b)       
     N_DL_max = N_DL_max + N_DL_opt
        Wend
    End Function
    Je ne sais pas si c'est une erreur dans la manière de faire la récursivité ou pas.
    Merci d'avance pour votre aide!

  2. #2
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Bonjour,

    Je ne sais pas si c'est une erreur dans la manière de faire la récursivité ou pas.
    Espace pile insuffisant c'est le danger dans toute fonction recursive, il faut tout de même s'assurer que l'on ne rentre pas dans des boucles infinies ce qui expliquerait largement le cas :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    While b > 0
           Call optimum(a, (nb_bis_tr - b))            N_DL_max = N_DL_max + N_DL_opt
        Wend
    Est-ce qu'on sort un jour de cette boucle ?

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    merci pour ta réponse;
    oui à un moment donné b est négatif ou nul et là on sort de la boucle.
    la preuve cette fonction marche pour certaines valeurs d'entrées, enfin une valeur sur les 7 possibles c'est pourquoi je vois pas où ça marche pas.

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bonbjour
    Tu es dans la situation de récursivité chaque fois que b est positif, mais également chaque fois que a est positif ('tes 2 while distincts...)
    Ce qui veut dire que la récursivité ne peut prendre fin que lorsque, à la fois, a et b sont <= 0

Discussions similaires

  1. C++ Problème de fonctions et pointeurs
    Par zmatz dans le forum C++
    Réponses: 3
    Dernier message: 01/10/2005, 16h20
  2. [MFC][WINSOCK] Problème avec fonction recv
    Par Le Farfadet dans le forum MFC
    Réponses: 4
    Dernier message: 23/09/2005, 11h00
  3. Problème de fonction
    Par Anduriel dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/05/2005, 20h30
  4. Problème avec fonction d'envoie de mail
    Par zyg dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 23/02/2005, 08h48
  5. [Requête] Problème avec fonction "DATE_FORMAT()"
    Par sekiryou dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2005, 21h52

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