Newsgroup: it.comp.lang.visual-basic
Titolo: Problemi con ciclo for e redim preserve

Sto sicuramente commettendo un errore grossolano in questo doppio ciclo for,
ma non riesco a capire dove.
Il ciclo è questo:
For i = 1 to Ubound(p())
For j = 1 To contptMin
If ptminnom(i, j) <> "" Then
pmin(i) = pmin(i) + 1
MsgBox ptminnum(i, j) & ptminnom(i, j) & i
ReDim Preserve puntimin(tcomp, pmin(i))
ReDim Preserve puntiminnom(tcomp, pmin(i))
'ReDim puntmin(pmin)
puntimin(i, pmin(i)) = ptminnum(i, j)
puntiminnom(i, pmin(i)) = ptminnom(i, j)
puntmin1(i) = pmin(i)
End If
Next
Next
Il problema è che il msgbox restituisce i valori corretti che dovrebbe dare,
il resto del codice, sotto il msgbox dovrebbe poi archiviare tali valori
mostratti appunto nel msgbox in matrici dinamiche.
Quello che in realtà succede è che mentre l'array puntmin1(i) a fine ciclo
assume i corretti valori, le matrici puntimin e puntiminnom sembrano
reinizializzarzi all'inizio di ogni ciclo i. Cioè per i = 1 tutto va bene ma
se esiste un i = 2 allora le 2 matrici di cui sopra mi si ridimensionano a
matrici (i, 1) e non (i, pmin(i)) come io vorrei.
Forse ho fatto un pò di confusione nell'esporre il problema...
Grazie dell'aiuto.

 ha scritto nel messaggio 
news:438d527a$0$328$5fc...@news.tiscali.it...


> If ptminnom(i, j) <> "" Then
Esattamente.
Cerco di spiegare meglio il problema dunque:
i valori chiave del tutto sono quelli che soddisfatta la condizione if
vengono stampati nel msgbox ptminnum(i, j) & ptminnom(i, j).
Fin qui va tutto come deve andare.
Ora nella seconda parte del codice io devo raccogliere questi valori in 2
matrici
puntimin() puntiminnom() che conterranno, quindi, alla fine del ciclo, solo
il valori che soddisfano la suddetta condizione if.
Di queste due matrici, mentre la prima dimensione è nota e vale tcomp (che
in pratica equivale all'indice i), non conosco a priori la loro seconda
dimensione che deve essere pari al numero degli elementi che soddisfano l'if
iniziale. Per questo motivo ho messo un contatore pmin(i) che mi indica per
ogni i qual'è il numero di elementi che soddisfa l'if e con il quale
ridimensiono di volta in volta le matrici "contenitore".
Questo è quello che vorrei fare, quello che ottengo in realtà è che quando
il ciclo va avanti per i, le matrici "contenitore" hanno sempre un solo
elemento valido nella seconda dimensione, cioè mi si creano matrici (i, 1).
Spero d'essere stato più chiaro nell'esplicare il mio contorto ragionamento
e chiedo anticipatamente scusa a tutti i programmatori di professione per
tutte le stupidate che potrei aver scritto ;-)

 Next
Ho deciso di rifiutarmi di leggere codice non indentato: io non sono come 
quello di matrix che riesce a vedere le ragazze fissando il monitor a 
fosfori verdi.
Ciao 

 Ciao
Ok... ci provo...
For i = 1 to Ubound(p())
    For j = 1 To contptMin
        If ptminnom(i, j) <> "" Then
            pmin(i) = pmin(i) + 1
            MsgBox ptminnum(i, j) & ptminnom(i, j) & i
            ReDim Preserve puntimin(tcomp, pmin(i))
            ReDim Preserve puntiminnom(tcomp, pmin(i))
            puntimin(i, pmin(i)) = ptminnum(i, j)
            puntiminnom(i, pmin(i)) = ptminnom(i, j)
            puntmin1(i) = pmin(i)
        End If
    Next
Next
E aggiungo anche una sorta di spiegazione di quello che "vorrei" fare:
I valori chiave sono quelli che, soddisfatta la condizione if,


 tutte le stupidate che potrei aver scritto ;-)
Se il problema è lo stesso del thread "Valore massimo in una matrice", hai dato
un'occhiata alla mia risposta (con tanto di pseudo codice) datata 25/11 17:38?
Tra l'altro è rimasta senza ulteriori reply da parte tua, cosa non molto carina
in generale :-(
Il succo della soluzione è "non usare matrici bidimensionali dinamiche" ma un
array di Variant (o un Type composto, come suggerito da Zanna).
Inoltre suggerivo di semplificare l'algoritmo andando ad immagazzinare per
ciascuna colonna solo gli *indici* di riga corrispondenti ai massimi, anziché
memorizzare anche i valori e i nomi corrispondenti...
Bye
Raf

 tutte le stupidate che potrei aver scritto ;-)
In realtà io ho problemi di attenzione e quando la spiegazione si 
attorciglia su più di tre/quattro righe mi va insieme la vista :)
Ma hai provato un bel debug passo-passo?
Secondo me trovi il problema in due minuti.
Ciao 

 nomi corrispondenti...
Alla luce di tutto ciò... mi andrò a studiare Type e cercherò di
semplificare l'algoritmo.
Chiedo nuovamente scusa per il mancato reply e grazie dell'aiuto.
Ciao

> Ma hai provato un bel debug passo-passo?
Ok. Lo farň, grazie e segurň anche il consiglio di Raf.
Ciao

 
il problema e' *concettuale*: poche idee ma ben confuse! ;-))
iniziamo da quelli meno gravi:
====
For i = 1 to Ubound(p())
ReDim Preserve puntimin(tcomp, pmin(i))
==
perche' prima usi Ubound(p()) e poi tcomp? anche se e' la stessa cosa 
rende il codice meno chiaro.
====
pmin(i) = pmin(i) + 1
..
puntmin1(i) = pmin(i)
==
i due array contengono gli stessi valori, ne basta uno.
====
ReDim Preserve puntimin(tcomp, pmin(i))
ReDim Preserve puntiminnom(tcomp, pmin(i))
==
veniamo al nocciolo del problema:
queste istruzioni modificano la seconda dimensione della matrice
*per tutte* le riche anche quelle precedenti, quindi l'unica riga che
avra' i valori corretti e' l'ultima; che se ha un solo valore condiziona 
tutti gli altri che comunque al massimo avranno conservato solo il 
valore dell'indice 1 che e' il redim minimo che fai.
HTH
bye
r

 valore dell'indice 1 che e' il redim minimo che fai.
Capperisottaceto! Eccolo qua l'errore!
Grazie mille nerone!