Newsgroup: it.comp.appl.access
Titolo: ricorsione e stack

Vorrei sapere se esiste un modo per definire la dimensione della stack in
quanto ho realizzato un programma in VB (in access 2000) che utilizza una
sub ricorsiva e in alcuni casi segnala stack overflow.
grazie

[CUT]
Ciao,
penso che tu stia analizzando il quesito cercando di rattoppare qualcosa che 
non va mentre a mio parere dovresti spostare l'ottica di visualizzazione....
Articoli come il seguente ti potrebbero essere d'aiuto ->
http://www.freeaspx.it/lezioni.aspx?idlezione=143
Buona serata :-) 

 wrote in message
news:P2kVe.44421$
O6.25...@news3.tin.it

Le funzioni ricorsive come è ovvio lavorano esclusivamente
con l'area di Stack nel quale salvano i punti d'interruzione
per poi gestire la ricorsione.
Il fatto che access però ti mandi in Overflow lo trovo molto
ma molto strano.
Occorrerebbe vedere come hai gestito la ricorsione, come hai
dichiarato le variabili ed altre cose.
Personalmente ho sviluppato molte funzioni in ricorsione
non ultima quella per lo sviluppo delle 
DI.BA
 ma non ho
mai incontrato nessun problema anche con la mia macchinetta
da poco un vecchio PIII(733Mhz).
Saluti
@Alex
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

[CUT]
Anche questo può esserti utile -> 
http://abstractvb.com/code.asp?A=1061
Notte :-) 

 ha scritto nel messaggio
news:40b05e6d05d7081dbc...@mygate.mailgate.org...

Il programma funziona correttamente se deve effettuare un numero di chiamate
non molto elevato (alcune decine) mentre quando deve elaborare dati più
complessi va in overflow. Preciso che il messaggio di overflow lo segnala
Visul Basic (il programma è scritto in VB ma fa uso delle tabelle di
access). Io passo alla sub variabili ByRef per evitare (credo) di usare
troppo l'area di stack e le variabili locali le ho definite Static come
riportato nel manuale di VB. Volevo dire a Gaspare che il programma è nato
come ricorsivo (utilizza le permutazioni di elementi non noti a priori) e va
in overflow con un troppi elementi da elaborare.
Grazie a tutti comunque per la vostra disponibilità


Ciao,
io ti ho solo suggerito di vedere come funziona l'allocazione/deallocazione 
di memoria in quell'area (considerando che può ritornati utile in fase di 
utilizzo) e fra le righe ti ho detto (è ovviamente la "mia" opinione...) che 
non mi sembra la soluzione adatta andare a vedere cosa di volta in volta 
occupi ( e liberi) con le tue funzioni/variabili x confrontarli con l'intera 
area che hai a disposizione -> quelli erano preoccupazioni che si potevano 
porre con le vecchie generazioni di pc...
Prova a postare, se ti va, il codice -> vediamo se riusciamo a "snellirlo" 
un pò! :-) 

riportato nel manuale di VB.
Come  ti dicevo, se + conosci bene quello che fai e - è la probabilità di 
commettere errori. Prova un pò a dare 1 occhiata a quest'articolo 
http://www.vbitalia.it/static/dichiarare_api2.htm
Ogni variabile posta in memoria ha un suo indirizzo.
i=10
10 è il valore della variabile e quindi se a me serve il valore uso ByVal. 
Se invece a me serve l'indirizzo di memoria di quella variabile (v. concetto 
di puntatore etc...) x poterne cambiare il contenuto etc... utilizzo la 
parola chiave ByRef.
Praticamente è come se in un cassetto conservi qualcosa e poi fai 
riferimento solo all'oggetto in questione o al cassetto che contiene 
l'oggetto...
E più o meno questo il concetto -> ovviamente va trattato in maniera 
tecnica...
Penso che cmq @Alex abbia tante cose da suggerirti! ;-)
Buona giornata :-) 

{CUT]
Giacchè ormai siamo OT giusto per nno perderti nei meandri di internet prova 
un pò a dare 1 occhiata alla rpima parte di quest'articolo -> 
http://www.science.unitn.it/~fiorella/guidac/guidac056.html
 

 ha scritto nel messaggio
news:2pAVe.57426$4g5.3...@news4.tin.it...

Il cuore del programma sono queste due funzioni.
Il programma crea il calendario di calcio di n squadre rappresentate dalle
lettere dell'alfabeto
La funzione ricorsiva è GENERA
 I parametri che gli passo sono:
la matrice COPPIE con 2 colonne e n righe: la prima colonna contiene le
combinazioni possibili di coppie di lettere AB AC AD ., la seconda colonna
contiene 0 o -1 ( falso o vero) per vedere se è stata usata.
La matrice GIORNATE è nXm contiene le coppie di squadre giornateXincontri
MIO_STACK è un vettore che mi consente di ritornare indietro se una
determinata combinazione di squadre non è corretta (il calendario non
procede)
Forse è un po' confuso:-)
Ho notato (dopo la tua segnalazione) che se provo a elaborare il calendario
con 14 squadre mi segnala l'errore ma con 15 o 16 fino a 19 no. Con 20 si.
Grazie
Sub genera(ByRef coppie, ByRef mio_stack, ByRef giornate, ByRef
indice_coppie, ByRef indice_mio_stack, ByRef indice_giornate, ByRef
indice_partita, ByRef L)
Static x As Integer
Dim fine_giornata As Boolean
fine_giornata = False
For x = indice_coppie To ((L - 1) * (L / 2))
    If coppie(x, 2) Then
        If (controlla(coppie(x, 1), giornate, indice_giornate,
indice_partita)) Then
            'l'elemento xesimo va bene
            indice_partita = indice_partita + 1
            giornate(indice_giornate, indice_partita) = coppie(x, 1)
'memorizza la coppia di squadre
            indice_mio_stack = indice_mio_stack + 1         ' aggiorna
l'indice dello mio_stack
            mio_stack(indice_mio_stack) = x                 ' gestisce lo
mio_stack
            coppie(x, 2) = 0                        ' imposta l'elemento
come usato
            If indice_partita = (L / 2) Then                        '
imposta la variabile semaforo
                                            fine_giornata = True    ' usata
per capire se è stata
                                                                    '
completata la giornata
                                            Exit For                ' esce
dal loop
                                        End If
        End If
    End If
Next x
If (fine_giornata = True) Then
        If Not ((indice_giornate = (L - 1) And (indice_partita) = (L / 2)))
Then  ' non ha finito
            x = 1   ' individuo il primo elemento utile nel vettore coppie
            Do While Not (coppie(x, 2))
             x = x + 1
            Loop
            indice_coppie = x
            indice_giornate = indice_giornate + 1
            indice_partita = 1
            giornate(indice_giornate, 1) = coppie(indice_coppie, 1)     '
memorizza la coppia di squadre
            indice_mio_stack = indice_mio_stack + 1
' aggiorna l'indice dello mio_stack
            mio_stack(indice_mio_stack) = indice_coppie
' gestisce lo mio_stack
            coppie(indice_coppie, 2) = 0                                '
imposta l'elemento come usato
            Call genera(coppie, mio_stack, giornate, indice_coppie,
indice_mio_stack, indice_giornate, indice_partita, L)
        End If
Else
    indice_coppie = mio_stack(indice_mio_stack)
    indice_mio_stack = indice_mio_stack - 1
    coppie(indice_coppie, 2) = -1
    indice_partita = indice_partita - 1
    indice_coppie = indice_coppie + 1
    Call genera(coppie, mio_stack, giornate, indice_coppie,
indice_mio_stack, indice_giornate, indice_partita, L)
End If
End Sub
Function controlla(stringa, ByRef giornate, ByRef indice_giornate, ByRef
indice_partita) As Boolean
'restituisce vero se la coppia di squadre non è stata ancora inserita
'nel vettore giornate
Dim x As Integer
Dim y As Integer
Dim prima_squadra As String
Dim seconda_squadra As String
Dim terza_squadra As String
Dim quarta_squadra As String
controlla = True
prima_squadra = Left$(stringa, 1)
seconda_squadra = Right$(stringa, 1)
For x = 1 To indice_giornate - 1    ' controlla se le due squadre hanno già
giocato
    For y = 1 To indice_partita     ' nelle precedenti giornate
        If (stringa = giornate(x, y)) Then
                    controlla = False
                    Exit Function
        End If
    Next y
Next x
    For y = 1 To indice_partita     ' controlla se una delle due squadre
gioca anche
                                    ' con altre squadre nella stessa
giornata
        terza_squadra = Left$(giornate(indice_giornate, y), 1)
        quarta_squadra = Right$(giornate(indice_giornate, y), 1)
        If (prima_squadra = terza_squadra Or prima_squadra = quarta_squadra
Or seconda_squadra = terza_squadra Or seconda_squadra = quarta_squadra) Then
            controlla = False
            Exit For
        End If
    Next y
End Function

 Forse è un po' confuso:-)
In effetti dovresti aggiungere qualche riga di commento...facciamo una cosa, 
sempre che ti vada bene -> inviami il form principale con i controlli da cui 
inserisci i dati da elaborare (parametri x le funzioni) ed appena posso gli 
dò 1 occhiata...tranquillo non me ne faccio niente del software...lo puoi 
semplificare al massimo e togliere tutte le parti complementari...mi bastano 
gli elementi fondamentali e una descrizione sintetica su quello che vuoi 
ottenere etc...
l'indirizzo è 
gasp...@infinito.it
Se hai proprio fretta puoi postare il codice sul forum di 
http://www.visual-basic.it/.
..
Buona giornata :-) 

[CUT]
...giusto x essere chiaro a me basta l'frm senza grafica o che con i 
controlli ed il codice necessario x dare 1 occhiata...
buona giornata :-) 

[CUT]
Ciao,
per permutazione intendi la seguente?
------------
Definizione: Si chiamano permutazioni di n elementi distinti, tutti i 
raggruppamenti diversi che si possono formare con gli elementi dati, 
rispettando le seguenti proprietà:
1. Ciascun raggruppamento contiene n elementi.
2. Uno stesso elemento non può figurare più volte in un raggruppamento.
3. Due qualsiasi raggruppamenti sono da considerarsi distinti quando 
differiscono solo per l'ordine con cui sono disposti gli elementi.
La tabella seguente mostra le permutazioni al variare di n
Per n = 2:
ab; ba.
Per n = 3:
abc; acb; bac; bca; cab; cba.
Per n = 4:
abcd; abdc; acbd; acdb; adbc; adcb;
bacd; badc; bcad; bcda; bdac; bdca;
cabd; cadb; cbad; cbda; cdab; cdba;
dabc; dacb; dbac; dbca; dcab; dcba;
Si può notare che il numero delle permutazioni in funzione di n è dato da 
n!, quindi abbiamo nel caso di n = 2, 2 permutazioni, per n = 3, 6, e per n 
= 4, 24 permutazioni.
-------------------

 ha scritto nel messaggio
news:RqTVe.50148$O6.27...@news3.tin.it...

Ti ho inviato tutto all'indirizzo mailto:
gasp...@infinito.it
Grazie
Roberto

[CUT]
Ok -> sei stato chiarissimo! Dammi un pò di tempo che x adesso sono un pò 
incasinato fra photoshop, css e xhtml! :-( 

[CUT]
Se sei d'accordo appena risolviamo il quesito la routine la pubblichiamo sul 
SC...che ne pensi? 

 ha scritto nel messaggio
news:qIWVe.50961$O6.27...@news3.tin.it...

Daccordo.
Roberto

 ha scritto nel messaggio
news:R60We.52514$O6.28...@news3.tin.it...

Sono sempre io anche se in alcune risposte appare robby seger (un grande
windsurfista)
Roberto

[CUT]
Ciao,
scusa ma il sei il "Roberto" -> pietra miliare di questa news-letter? Uno 
degli autori del SC? 

 wrote in message
news:0fPWe.3508$
jG6.1...@news3.tin.it

Stai commettendo un errore di persona.
E' un caso di Omonimia.
Ciao.
Non ho ripreso la cosa in quanto mi sono assentato
per qualche gg, ma senza codice alla mano non credo
ci sia altro da aggiungere.
Le tue considerazioni su ByRef e ByVal sono alla
base di tutto direi, ma non solo anche l'uso di variabili
di tipo STATIC in una ricorsione sono ingombranti.
Sarebbe meglio valutare l'uso di Public o Private
se all'interno di Form, ma questo fa parte della base.
Ora quando si dice che la funzione funziona, ma va in OverFloow
per me č sinonimo che non funziona, ed anche qualora funzionasse
se non vengono osservate le regole minime dell'uso delle
variabili(e la ricorsione č rigida in questo senso) sia
come dichiarazione di Type che come metodo di dichiarazione
si rischia di avere qualche problema.
Con il numero di risoluzioni che hai citato č assurdo avere
problemi, io ho sfruttato ricorsioni a oltre 10 livelli
su oltre un migliaio di prodotti composti ognuno da prodotti
senza problemi con il mio lattone....!
Saluti.



Sono perfettamente d'accordo con te anche se non definirei il tuo proprio un 
lattone -> io mi sono parecchio legato ad 486 con 4 MB di RAM con il quale 
ne ho fatte parecchie di battaglie ed il cui monitor č diventato 
letteralmente "nero" che sinceramente non lo dimentico nonostante i nuovi pc 
! ;-)
Buon fine-settimana a te e famiglia :-)
Gaspare 

 ha scritto nel messaggio
news:0fPWe.3508$jG6.1...@news3.tin.it...

NO non sono il Roberto di cui parli ..
altrimenti forse non avrei posto il quesito :-)
Roberto

[CUT]
Ok ->...il tuo codice è sempre in coda! ;-)
Buon week-end :-) 

 ------------
[CUT]
Le permutazioni sono proprio queste, ma sinceramente
mi sfugge l'elemento RICORSIVO in questo tipo di
lavoro......!
