Saturation de la Pile

Bonjour,

Je m'essaye toujours à la programmation VBE

En cas d'erreur pour dépassement de la capacité de la pile

1) Comment voir son contenu

2) Comment la vider manuellement après la déclaration d'erreur

3) Comment la vider dans un programme à un instant opportun, sans interrompre le programme

Mes recherches ne m'ont encore rien donné d'exploitable à mon petit niveau

Quelqu'un pour m'aider ?

Bonjour,

Il faudrait que tu nous montres ton code, la "pile" est en fait la pile des appels comme il peut arriver en utilisant une fonction ou Sub récursive !

Un simple test pour voir les limites, lancer la sub "Test()" :

Sub Test()

    Dim NBAppel As Long

    On Error GoTo Fin

    NBAppel = 0
    Recursive 1, NBAppel
    Exit Sub

Fin:

    MsgBox "Nombre d'appels jusqu'à saturation : " & NBAppel

End Sub

Function Recursive(I, NBAppel)

    NBAppel = NBAppel + 1

    'appel récursif où il n'est pas possible d'en sortir !
    Recursive = Recursive(I + 1, NBAppel)

End Function

Bonjour,

Dans le cas le plus fréquent il y a dépassement de capacité en cas d'erreur de dimensionnement des variables :

Sub test()
Dim S as integer, i&
S = 10
On Error GoTo Fin
For i = 1 To 10
 S = S ^ 2
Next
Exit Sub
Fin:
MsgBox S
End Sub

Le MsgBox affiche 10 000 car S est dimensionné en integer :

et le dernier appel a produit une erreur 6 "Dépassement de capacité" car les integer ne peuvent dépasser 32 767...

A+

Hello Galopin01 !

Effectivement, comme Cyber Topaze a parlé de la pile, je n'ai pas pensé au dépassement de capacité des variables

Bonjour,

Le test de Theze m'aide bien

en effet J'obtiens 806 appels avant saturation de la pile

alors que j'en suis à peine à 25 !

Comme j'ai fait le test sur un classeur vide je vais le faire aussi sur le classeur en cause en arrêtant le programme au bout de 2 ou 3 appels

Je vais mieux regarder ma déclaration de variables comme suggère galopin01

Merci pour l'instant

Je reviendrai avec du nouveau

Re-Bonjour

le programme de Theze est super, d'un grand secours pour moi;

J'ai intégré une ligne dans la boucle pour l'appeler et je peux suivre l'évolution de la pile. Au moment du blocage il indiquait qu'il restait plus de 750 appels donc le blocage ne vient pas de là.

Merci galopin01 j'ai effectivement changé une déclaration de variable de string à Variant et le blocage initial a disparu. Mais un autre est apparu.

Le programme est presque de type brute force. Les macros M1 et M2 s'appellent mutuellement pour faire évoluer un travail. Un test dans M1 vérifie s'il est terminé sinon continue le bouclage.

Un autre test dans M1 vérifie une condition qui éventuellement sort du bouclage par appel d'une macro M3 laquelle change un paramètre et relance le bouclage par M1 en reprenant tout comme au début, après avoir remis tous les compteurs à 0 (nouveau cycle); et les cycles s'enchainent jusqu'à la fin du travail.

J'en suis là:

cycle 1 =6 boucles cycle2=6boucles cycle3 = 5 boucles cycle4 =7 boucles cycle5=7 boucles

cycle 6 = 6 boucles cycle 7 = 7 boucles erreur !

je crois qu'en écrivant je viens de comprendre: je dois avoir une faute de conception : Chaque cycle travaille sur une cellule différente choisie chaque fois par M1 selon certains critères. Au stade erreur je pense que le programme ne trouve plus de cellules répondant au critère ou quelque chose comme ça.

Donc j'en reste là pour la demande d'aide et je me paufine l'algo.

En tout cas votre participation a été très efficace 1) elle m'a débloqué 2) elle ferme la piste Pile qui m'obnubilait et m'empêchait de voir ailleurs

Merci pour tout.

Rechercher des sujets similaires à "saturation pile"