OVH Cloud OVH Cloud

debordement de pile

16 réponses
Avatar
ST
Bonjour,

J'ai écrit un prog en VB qui fonctionne bien ( télémesures ), sauf qu'au
bout de quelques heures de fonctionnement, j'ai un débordement de pile. Il
faut dire que c'est de la programmation recursive, et qu'il me sera
difficile de linéariser.

Quelle solution pour résoudre ou purger cette pile ?

D'avance merci

ST

6 réponses

1 2
Avatar
Patrice Henrio
Je ne connais pas en VB *y, mais en C, oui. Peux-tu éclairer ma lanterne.

"le_troll" a écrit dans le message de
news:
Bonjour,

Tu as aussi je crois les variables de taille fixe qui sont empilées:


(*
y)
dim x as string * y

--
Merci, @+, bye, Joe
troll75 AROBASE iFrance POINT com
------------------------------------------
Le_Troll, éleveur de Trolls depuis César, qui disait:
Avec une hache, celui qui tient le manche a toujours raison !


"ST" a écrit dans le message de
news:
> Bonjour,
>
> J'ai écrit un prog en VB qui fonctionne bien ( télémesures ), sauf qu'au
> bout de quelques heures de fonctionnement, j'ai un débordement de pile.


Il
> faut dire que c'est de la programmation recursive, et qu'il me sera
> difficile de linéariser.
>
> Quelle solution pour résoudre ou purger cette pile ?
>
> D'avance merci
>
> ST
>
>




Avatar
Jean-Marc
"Patrice Henrio" a écrit dans le
message de news:
Je ne connais pas en VB *y, mais en C, oui. Peux-tu éclairer ma lanterne.



Dim s As String * 100

Déclare s comme une chaine de taille fixe (ici 100 caractères)
Ca initialise en même temps la chaine ainsi créée avec des espaces, et si tu
fais:
s= ""
alors len(s) = 100 qd meme.

'------------
Private Sub Command1_Click()
Dim s As String * 100

s = ""
Debug.Print Len(s)
Debug.Print Asc(Mid$(s, 1, 1))
End Sub
'------------

--
Jean-marc
Avatar
Patrice Henrio
OK merci, je ne connaissais pas.

"Jean-Marc" a écrit dans le message de
news:413f6ba0$0$4188$
"Patrice Henrio" a écrit dans le
message de news:
> Je ne connais pas en VB *y, mais en C, oui. Peux-tu éclairer ma


lanterne.

Dim s As String * 100

Déclare s comme une chaine de taille fixe (ici 100 caractères)
Ca initialise en même temps la chaine ainsi créée avec des espaces, et si


tu
fais:
s= ""
alors len(s) = 100 qd meme.

'------------
Private Sub Command1_Click()
Dim s As String * 100

s = ""
Debug.Print Len(s)
Debug.Print Asc(Mid$(s, 1, 1))
End Sub
'------------

--
Jean-marc




Avatar
Patrice Henrio
J'ai étudié ton code et je pense que tu peux facilement supprimer la
récursivité si j'ai bien compris. En effet elle est mal programmée et pas
adaptée à ton cas.

On utilise la récursivité pour simplifier un problème : exemple facile de la
fonction factorielle
factorielle(n) = 1* 2 *3 ... * n
On voit que l'on ne sait pas à priori combien de multiplication on doit
faire, on ne le sait qu'une fois que l'on a défini n.
Une autre définition est factorielle(1) vaut 1 et factorielle(n) vaut
n*factorielle(n-1) si n>1

Première définition

function factorielle(n as integer) as integer
dim resultat as integer, I as integer
resultat=1
for I= 1 to n
resultat=resultat*i
next I
factorielle=resultat
end function

deuxième définition

function factorielle(n as integer) as integer
if n<2 then
factorielle=1
exit function
end if
factorielle=n*factorielle(n-1)
end function

Dans ton cas la récursivité est utilisée au niveau de main2

main2 appelle 2 sub (mesure et tension), puis controle (qui dans certain cas
rappelle main2) et enfin 3 sub (temp, pluie, affichage)

si j'ai bien compris, les appels sont liés au fait que les mesures ne sont
pas valides mais alors tu va empiler plein de mesure sans jamais dépiler,
pire si tu arrivais à déplier on te renverrai toutes tes mesures invalides.


Voici ma proposition

sub main2
dim valide as boolean
valide = false
while not valide
prise_mesure
tension
valide=((v2 < 4.42 and v2> 1.2) or ....
if not valide then Beep
wend
temperature
pluie
affichage
end sub

Dernière chose : pour les expressions logiques, je ne fais jamais confiance
au langage et donc j'écrirai ta condition sous la forme
if (((v2<4.42) and (v2>1.2)) or ...

Bon courage

je n'ai peut-être rien compris à ton programme ...

"ST" a écrit dans le message de
news:uSSbw$
Voici le code

"Jean-Marc" a écrit dans le message de news:
413f533d$0$4153$
> "ST" a écrit dans le message de
> news:
> > Bonjour,
> >
> > J'ai écrit un prog en VB qui fonctionne bien ( télémesures ), sauf


qu'au
> > bout de quelques heures de fonctionnement, j'ai un débordement de


pile.
Il
> > faut dire que c'est de la programmation recursive, et qu'il me sera
> > difficile de linéariser.
> >
> Hello,
>
> par curiosité et aussi pour pouvoir peut être aider, pourrais tu


indiquer
ce
> que tu fais de récursif ?
>
> --
> Jean-marc
>
>





Avatar
jean-marc
"Patrice Henrio" wrote in message
news:#
Dans ton cas la récursivité est utilisée au niveau de main2

main2 appelle 2 sub (mesure et tension), puis controle (qui dans certain


cas
rappelle main2) et enfin 3 sub (temp, pluie, affichage)

si j'ai bien compris, les appels sont liés au fait que les mesures ne sont
pas valides mais alors tu va empiler plein de mesure sans jamais dépiler,
pire si tu arrivais à déplier on te renverrai toutes tes mesures


invalides.

j'étais sur et certain que c'était un truc du genre.
Solution: tout refaire, proprement cette fois.

--
Jean-marc
Avatar
Serveur News
c'est ok, merci beaucoup à tous

"Patrice Henrio" a écrit dans le
message de news:%
J'ai étudié ton code et je pense que tu peux facilement supprimer la
récursivité si j'ai bien compris. En effet elle est mal programmée et pas
adaptée à ton cas.

On utilise la récursivité pour simplifier un problème : exemple facile de


la
fonction factorielle
factorielle(n) = 1* 2 *3 ... * n
On voit que l'on ne sait pas à priori combien de multiplication on doit
faire, on ne le sait qu'une fois que l'on a défini n.
Une autre définition est factorielle(1) vaut 1 et factorielle(n) vaut
n*factorielle(n-1) si n>1

Première définition

function factorielle(n as integer) as integer
dim resultat as integer, I as integer
resultat=1
for I= 1 to n
resultat=resultat*i
next I
factorielle=resultat
end function

deuxième définition

function factorielle(n as integer) as integer
if n<2 then
factorielle=1
exit function
end if
factorielle=n*factorielle(n-1)
end function

Dans ton cas la récursivité est utilisée au niveau de main2

main2 appelle 2 sub (mesure et tension), puis controle (qui dans certain


cas
rappelle main2) et enfin 3 sub (temp, pluie, affichage)

si j'ai bien compris, les appels sont liés au fait que les mesures ne sont
pas valides mais alors tu va empiler plein de mesure sans jamais dépiler,
pire si tu arrivais à déplier on te renverrai toutes tes mesures


invalides.


Voici ma proposition

sub main2
dim valide as boolean
valide = false
while not valide
prise_mesure
tension
valide=((v2 < 4.42 and v2> 1.2) or ....
if not valide then Beep
wend
temperature
pluie
affichage
end sub

Dernière chose : pour les expressions logiques, je ne fais jamais


confiance
au langage et donc j'écrirai ta condition sous la forme
if (((v2<4.42) and (v2>1.2)) or ...

Bon courage

je n'ai peut-être rien compris à ton programme ...

"ST" a écrit dans le message de
news:uSSbw$
> Voici le code
>
> "Jean-Marc" a écrit dans le message de


news:
> 413f533d$0$4153$
> > "ST" a écrit dans le message de
> > news:
> > > Bonjour,
> > >
> > > J'ai écrit un prog en VB qui fonctionne bien ( télémesures ), sauf
qu'au
> > > bout de quelques heures de fonctionnement, j'ai un débordement de
pile.
> Il
> > > faut dire que c'est de la programmation recursive, et qu'il me sera
> > > difficile de linéariser.
> > >
> > Hello,
> >
> > par curiosité et aussi pour pouvoir peut être aider, pourrais tu
indiquer
> ce
> > que tu fais de récursif ?
> >
> > --
> > Jean-marc
> >
> >
>
>
>






---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.759 / Virus Database: 508 - Release Date: 09/09/2004
1 2