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 :

espace pile insuffisant


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Par défaut espace pile insuffisant
    Bonsoir , j'ai écrit une fonction récursive qui calcule la somme des n 1ers entiers , j'ai écrit une macro pour la tester et à la compilation j'ai l'erreur suivante :

    erreur 28 , mémoire sur la pile insuffisante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Function sommeEntiersRec(ByVal n As Long) As Long
    Dim i As Long
        If i <= n Then
        sommeEntiersRec = sommeEntiersRec(n)
        Else
        sommeEntiersRec = n
        End If
    End Function
    au déboggage ça me surligne la ligne en dessous du if en jaune , si quelqu'un peut m'éclairer , merci .

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Par défaut
    bonsoir

    tu crées une boucle récursive sur cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        sommeEntiersRec = sommeEntiersRec(n)
    L'exécution se termine par une erreur 28 car il n'y a pas d'instruction pour sortir de la fonction.


    bonne soirée
    michel

  3. #3
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    Ton problème : lorsque tu passes n de manière récursive, tu ne le décrémente jamais.
    Tu crées ainsi une boucle infinie... d'où ton problème de pile

    Maintenant, il est inutile de faire une fonction récursive pour cela !
    Tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Function SommEntiers(n as long) as long
        SommeEntiers=(1 + n) * (n \ 2) + (n Mod 2) * (n \ 2 + 1)
    End Function
    Ou, si vraiment tu tiens à faire travailler ton processeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Function SommEntiers(n as long) as long
        Dim i as long
        Dim r as long
        For i = 1 to n
            r = r +i
        Next
        SommeEntiers = r
    End Function
    Par contre, tu ne pourras pas passer un nombre entier supérieur à 65535 dans n sinon... dépassement de capacité de la fonction !

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Par défaut
    je pensais que je sortais de ma fonction par le end if...

    je dois obligatoirement utiliser la récurisvité , obligation de l'exercice

    puis regarde cette fonction est exactement la meme que la mienne ( meme structure ) et elle marche , :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function reste(byval p as integer , byval q as integer) as integer
    if p >= q then
    reste = reste(p-q, q)
    else
    reste = p
    end if
    end function
    ici on a pas l'air de sortir de la fonction , comme la mienne , pourtant la mienne marche pas ...

  5. #5
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonsoir.

    La somme des n premiers entiers vaut :
    n*(n+1)/2

    si tu veux pour l'exrcice une fonction récursive, essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function fctS(n As Long) As Long
     
    If n > 0 Then
        fctS = fctS(n - 1) + n
    Else
        fctS = 0
    End If
     
    End Function
    Bon courage,

    PGZ

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Par défaut
    merci pgz ça marche mais ici où sort on de la fonction c'est celà que j'aimerais savoir ...

  7. #7
    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
    Par défaut
    Le paramètre n de la fonction rappelée en récursivite décroit de 1 à chaque appel (fctS = fctS(n - 1) + n) et la fonction s'arrête si n = 0 (If n > 0 Then)

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Par défaut
    ok donc j'en conclus que pour sortir de la fonction je dois écrire fonction = 0 , merci c'est compris .

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Par défaut
    pgz non ya une chose que je comprends pas , tu dis que la formule de la somme des n 1ers entiers c'est n(n+1)/2 , prenons la somme des 3 1ers entiers ça donne :

    1+2+3 = 6

    avec ta formule mathématique ça donne

    3(3+1)/2 = 6

    mais avec ta récusion ça donne :

    pour n = 3 > fctS = fctS(3-1) + 3 = 5
    pour n = 2 > fctS = fctS(2-1) + 2 = 3
    pour n = 2 > fctS = fctS(1-1) + 1 = 1

    si j'additionne ca me fait 9 , ya un truc que j'ai pas compris , si quelqu'un pouvait m'expliquer , merci

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function sommeEntiersRec(ByVal n As Long) As Long
    Dim i As Long
        If i <= n Then
        sommeEntiersRec = sommeEntiersRec(n)
        Else
        sommeEntiersRec = n
        End If
    End Function
    Je reprends ta fonction : Si i <= n revient à dire si 0 <= n alors je rappelle la fonction. Et comme i, que tu déclares dans la fonction, sera toujours = à 0, si n > 0 alors tu rappelles la fonction en boucle.
    Tu dois affecter une valeur à i pour que ta fonction ait un sens... Ou bien tu pourrais remplacer i par 0. Mais est-ce que tu veux ?
    Si tu ne déclarais pas i dans la fonction, on pourrait penser qu'il est déclaré en public, mais là... Maintenant si n = 0, la fonction retourne 0.
    Tu peux nous éclairer sur le sens de l'i ?

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Par défaut
    merci ouskel mais tu peux oublier ce "i" que j'ai vite zappé , pour ce qui m'interesse c'est de savoir comment on est passé de la formule mathématique à la formule récursive , voir message au dessus

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Teste ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function Somme(entier)
    Dim nombre
        Somme = Somme + entier
        nombre = entier - 1
        If nombre > 0 Then
                Somme = Somme + Somme(nombre)
            Else
                Exit Function
        End If
    End Function
    Bonne nuit

  13. #13
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    Citation Envoyé par Maxence45 Voir le message
    si j'additionne ca me fait 9 , ya un truc que j'ai pas compris , si quelqu'un pouvait m'expliquer , merci
    Tu devrais lancer la macro en mode débogage...
    En fait, on va remonter la pile...

    tu appelles fcts en lui passant 3 comme argument
    Comme la fonction est récursive, elle va s'appeler elle-meme en se passant à chaque fois l'argument -1

    On a donc, depuis ton appel :
    fcts(3) => fcts(2) => fcts(1) => fcts(0)
    puis la remontée des résultats jusqu'à l'appel de la fonction

    Partons de la dernière et remnotons donc !
    fcts(0) = 0
    fcts(1) = fcts(0) + 1 = 0 + 1 = 1
    fcts(2) = fcts(1) + 2 = fcts(0) + 1 + 2 = 0 + 1 + 2 = 3
    fcts(3) = fcts(2) + 3 = fcts(1) + 2 + 3 = fcts(0) + 1 + 2 + 3 = 0 + 1 + 2 + 3 = 6

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Par défaut itérativité somme valeur
    Bonsoir , cette fonction calcule la somme d'une suite géométrique , de manière itérative :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function sommeSerieGeoRec(ByVal x As Double, ByVal n As Long) As Double
    Dim i As Integer, res As Double
    res = 1
        For i = 1 To n
        res = res * x + 1
        Next i
    sommeSerieGeoRec = res
    End Function
    si je prends x = 2 et n = 3 ça fait 1 + 2^1 + 2^2 + 2^3 = 15 .

    mais ici , j'essaye de faire un tableau de variation à chaque tour de boucle :

    hypothèse de départ : x = 2 .

    pour 0 tour j'ai res = 1
    pour 1 tour j'ai res = 1*2 + 1 = 3
    pour 2 tours j'ai res = 3*2+1 = 7
    pour 3 tours j'ai res = 7*3+1 = 22

    on dépasse de loin les 15 et seconde chose où il est noté qu'on additionne les résultats de chaque tour de boucles ?

    merci

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Par défaut
    ça ira j'ai compris tte seule

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

Discussions similaires

  1. Espace pile insuffisant sur Excel 2007 mais pas sur Excel 2010
    Par caje17 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/11/2014, 20h37
  2. [XL-2000] VBA Erreur 1004 espace pile insuffisant
    Par L'Albatros dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 17/07/2013, 14h34
  3. espace de pile insuffisant
    Par jul54 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 15/12/2006, 17h51
  4. VB6 - Espace de pile insuffisant
    Par Maxwell dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 04/08/2006, 16h12
  5. [VB6] Espace de pile insuffisant
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 05/04/2004, 16h26

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