Newsgroup: it.comp.lang.visual-basic
Titolo: Spazio dello stack esaurito (errore 28)

Ciao,
ho scoperto cosa fa piantare la mia serie di sub, in Excel (lo so che qui e'
Access, m avia, il VBA e' lo stesso...):
su alcuni PC (solo su alcuni, senza apparentemente una logica di RAM, CPU,
tipo di installazione di Office, rete, SR pack di Office...nulla!) si pianta
con l'errore "Spazio dello stack esaurito (errore 28)".
Il tutto succede dopo una serie come la seguente:
- 3 do..loop nidificati
- dentro il terzo un if..else
- dentro questo la chiamata ad una function con un suo do..loop (il 4°)
- dentro quest'ultimo un'altro if..else.
Ok, sono tanti, ma perche' e' cosi' "casuale"?
Mi sapete suggerire un buon metodo per venirne a capo?
Grazie,
Marco

you wrote :
#si pianta con l'errore "Spazio dello stack esaurito (errore 28)".
#Il tutto succede dopo una serie come la seguente:
#
#- 3 do..loop nidificati
#- dentro il terzo un if..else
#- dentro questo la chiamata ad una function con un suo do..loop (il 4°)
#- dentro quest'ultimo un'altro if..else.
#
#Ok, sono tanti, ma perche' e' cosi' "casuale"?
A meno che non sia un bug di VBA (improbabile, a mio avviso) secondo
me bisognerebbe dare un'occhiata al codice.
E' anche probabile, difatti, che all'interno di un do..loop si faccia
riferimento ad una chiamata della stessa sub/funzione rendendo
pertanto il processo ricorsivo.
I processi ricorsivi sono quelli che, generalmente, divorano lo stack
a quattro palmenti...
Andrea Laforgia        (
andrea_...@bigfoot.com
)
----------------------------------------------------
There is nothing better for understanding a kangaroo
than seeing it jump.
----------------------------------------------------

 Ok, sono tanti, ma perche' e' cosi' "casuale"?


sec'e' anche nell'editor di VBA...
Ok, mi mostra tutte le routine "aperte" fino ad un momento.
Che me ne faccio? :-)
So in quale routine si pianta (a volte, random solo su alcuni pc).
Quello che non so e' perche'.
Ho messo troppi cicli annidati? Ma perche' su certi pc va e su altri no?
Voglio dire: se esaurisco lo spazio dello stack, quale risorsa dei pc vado a
toccare?
Come posso vedere se i pc che mi danno il difetto hanno caratteristiche
differenti dagli altri?
Se ho messo troppi cicli annidati (in tutto 4 do/loop e 2 if/else/endif) non
posso che sostituirli, che ne so, con dei for/next...con dei
select/case...questi migliorano il problema dello stack? O devo proprio
metterne meno..?
Grazie per l'aiuto...a capire!
Marco

...


 wrote in message
news:7n1fp9$14tu$1...@stargate1.inet.it...


 wrote in message
news:auYk3.1412$X%.15240@typhoon.libero.it...


you wrote :
#Voglio dire: se esaurisco lo spazio dello stack, quale risorsa dei pc vado a
#toccare?
Mi sembra chiaro : lo stack allocato per quel programma, cioe' una
porzione di memoria abbastanza limitata (qualche decina di Kb)
destinata a contenere dei dati in modo dinamico, che solitamente sono
i parametri delle funzioni e le variabili locali.
#Se ho messo troppi cicli annidati (in tutto 4 do/loop e 2 if/else/endif) non
#posso che sostituirli, che ne so, con dei for/next...con dei
#select/case...questi migliorano il problema dello stack? O devo proprio
#metterne meno..?
Il problema, secondo me, e' capire che cosa c'e' nei do...loop.
E' probabile, difatti, che vi sia un processo ricorsivo.
Non potresti postare il codice ?
Per esempio il seguente codice esaurisce molto presto lo stack :
Private Sub EsaurisciStack()
        Dim A(0 To 99) As String
        Dim I As Integer
 
        For I = 1 To 10
            Call EsaurisciStack
        Next I
End Sub


che ne passi 10byte o 1000 e' lo stesso
Dopo esserne uscito (e dopo una settimana di ferie :-)
vorrei rendervi edotti su cosa, in excel vba, puo' causare
l'errore 28 (stack esaurito).
Era (incredibile) una copia-da-un-foglio-e-incolla-su-un-altro.
il "problema" era che selezionavo un range di 6x1 celle
"tutto insieme" e lo copia/incollavo.
Per eliminazioni successive, ho dedotto che il problema
fosse quello. Copia/incollando le celle una alla volta il
problema sparisce.
Auguri!
Marco