Newsgroup: it.comp.lang.visual-basic
Titolo: Funzioni ricorsive in VB6

Premetto che è da poco che utilizzo VB...
Devo realizzare una funzione ricorsiva, è un algoritmo di region growing per
BMP. In pratica dato un pixel di una BMP controlla il pixel rispetto ad uno
standard, modifica una matrice (usata come flag) e poi chiama ricorsivamente
i pixel adiacenti.
Il codice è il seguente:
Public Function RGrowing(ByVal x As Integer, ByVal y As Integer)
'Pixel inesistente
If ((x < 0) Or (x > Picture2.ScaleWidth) Or (y < 0) Or (y >
Picture2.ScaleHeight)) Then
Exit Function
End If
'pixel già marcato nella matrice
If Matrix(x, y) = 1 Then
Exit Function
End If
If GetPixel(Picture2.hdc, x, y) = GetPixel(Picture2.hdc, Xpi2, Ypi2) Then
Matrix(x, y) = 1
End If
RGrowing(x - 1, y)  'mi da errore, dovrei chiamare ricorsivamente la
funzione per quattro volte, per x,y+1, per x+1,y e per x,y-1
End Function
Il problema è questo:
Mi da un errore di compilazione alla riga
RGrowing(x - 1, y)
dicendomi previsto :=
come mai?
Ho provato a scrivere una funzione ricorsiva più semplice (il fattoriale
dell'argomento) e non ci sono problemi....
Public Function Fatt(ByVal x As Integer)
If x = 1 Then
Exit Function
End If
fat = fat * x
Fatt (x - 1)
End Function
Potete aiutarmi?
grazie mille!!!
--
P.
--
Una possibilità su un milione si verifica nove volte su dieci.
Nonnina Weatherwax

 RGrowing(x - 1, y)
Togli le parentesi! :-D

 Togli le parentesi! :-D
P.S.: oppure, se vuoi che sia anche piu' veloce, visto che non ti serve il
valore di ritorno:
1) Togli le parentesi
2) Dichiarala come Sub e non come Function


argh......
maledetto C
^___^
Adesso però ho un altro problema....
Durante l'esecuzione s'impianta proprio a quella riga e appare:
errore run-time "28"
spazio dello stack esaurito
qualche consiglio?
grazie
--
P.
--
Capisci che il mondo sta impazzendo quando il miglior rapper è un
bianco, il miglior giocatore di golf è di colore, la Svizzera detiene
l'America's Cup di vela, la Francia accusa gli Stati Uniti di
arroganza e la Germania non vuole entrare in guerra e il miglior
pizzaiolo a Napoli è un giapponese

 qualche consiglio?
significa che non esce dal ciclo o che sono state fatte troppe iterazioni
(non credo). Verifica.
-- 
<Gigio2K>
--- 
http://www.g2kweb.it/gigio2k
 ---
Nokia -> I.T.H.N. -> 
http://www.ithn.it/
VB -> I.C.L.VB -> 
http://www.it-lang-vb.net/

La Sub/Function ti dà quell'errore di stack esaurito perchè è entrata in 
loop.
A ben guardare il tuo codice, effettivamente, non c'è un caso in cui la 
funzione non venga richiamata ricorsivamente.
Cioè più richiami la funzione, più essa richiama sè stessa senza mai 
fermarsi.
Penso che non setti mai a 1 gli elementi nella Matrix(x,y), perchè la 
condizione dei due GetPixel non si verifica mai.
Controlla quella porzione di codice...
-- 
Rivolterò il mondo per trovarlo, e anche se andasse in Indocina uno dei 
nostri starà nascosto in una ciotola di riso pronto a sparargli nel culo.
(Pulp Fiction)

 >> End Function
uhm, la tua funzione non dichiarata ritorna una VARIANT sullo stack ....
sedici byte fumati per niente.
Se n'è parlato di recente (tra l'altro, curiosamente assomiglia anche nello
scopo del FloodFill grafico di coloritura di cui avevo parlato)
Cmq, 16 byte delal variant di ritorno (neppure usata) più altri 2+2+4 byte
tra argomenti e indirizzo di ritorno (più extra che non conosco), sempre che
gli short integer vengano passati usando il ragionevole 2 byte e non 4,
fanno come minimo 24 byte a chiamata.
Dovresti implementarti uno stack fittizio di interi per i tuoi parametri (da
allocare in una matrice dinamica), con due piccole funzioni di accesso, pop
e push, per rimuovere i parametri dalla routine, da dichiarare come SUB se
non ti occorre valore di ritorno (ma questo forse l'aveva già detto qualcun
altro, giustamente) senza parametri.
variabili locali automatiche non ne hai quindi lì non si può limare nulla
(beh, eccetto alcune espressioni calcolate al volo come "X+1", "Y-1", che
sono pur sempre dei valori temporanei allocati sullo stack cmq. Non che sia
una funzione esosa .... dipende però quanto profondo è l'annidamento delle
chiamate.
Per questo un po' ODIO il ricorsivo, non puoi mai sapere in anticipo in
quale circostanza ti si pianterà il programma.
ciao
CCCP++Mario


 il miglior pizzaiolo a Napoli è un giapponese
Makato Onishi :-)
-- 
ale
http://www.sen.it
rara temporum felicitate, ubi sentire
quae velis, et quae sentias dicere, licet

 CCCP++Mario
P.
--
Se Dio esiste, spero che abbia una scusa valida.
D. Pennac

 > in quale circostanza ti si pianterŕ il programma.
