Newsgroup: it.comp.lang.visual-basic
Titolo: Ubound non valido: quale test?

Il subject è criptico, ma vedo di spiegarmi.
Ho un array Array_1, che viene redim-ensionato leggendo dei dati da file.
Quindi può contenere da 0 a numerosi elementi.
E' dimensionato come
Private Array_1() As String
Se devo fare un loop e scandirmi l'array, faccio:
        Max_Loop = UBound(Array_1, 1)
        For N = 1 To Max_Loop
Ma se l'array non ha subito alcun redim, ubound fallisce (indice non
compreso nell'intervallo).
Ho provato a testare con isempty, isnull, isarray, ma tutte mi lascerebbero
'passare'.
A parte intercettare l'errore, esiste modo di testare se un array non è mai
stato dimensionato?
Ciao
Alberto

 è mai stato dimensionato?
facendo una rapida ricerca su google gruppi, ho trovato post di alcuni
personaggi, dei quali mi fido ciecamente, che sostengono che
l'intercettazione dell'errore sia l'unica strada...
--
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo


Già problema ormai noto ..
io personalmente uso una variabile bool per sapere se l'array è stato
inizializzato  o meno.
Altra alternativa è l'utilizzo del variant
Dim X as Variant
X = Array(1, 2, 3)
?UBound(X)  .... 2
X = 0
?IsArray(X) ... False
Ovviamente va bene solo per pochi elementi e per comodità di scrittura di
codice ...
l'overhead creato con l'utilizzo di variant non credo sia accettabile.
Saluti

 inizializzato  o meno.
Io imbroglio un po' e faccio cosě:
dim matrice(-1 to -1) as tipo
Se l'ubound č -1 assumo che la matrice non č inizializzata e provvedo al
redim
termoPilucco


Puň andare...
Si bruciano un paio di elementi, perchč non si puň ridimensionare preserve
modificando lbound, ma basta poi gestire correttamente il loop...
Ciao
Alberto


Eppure qualcosa non mi torna...
Intendi dire che fai un redim nel Load, o proprio che dimensioni l'array in
quel modo?
Ciao
Alberto

 quel modo?
Sono andato a vedere... in effetti la dimensiono dinamica e la ridimensiono
a -1 nella routine di inizializzazione programma... non č molto elegante...
meglio un bel 'on error', anche se non so cosa succede runtime se si compila
con tutte le ottimizzazioni sugli array...
termoPilucco

 array...
Niente, funziona regolarmente...
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 Niente, funziona regolarmente...
Meglio cosě, vada per l'on error
termoPilucco, resume next

> Meglio così, vada per l'on error
Ho notato che Win2000/XP danno moooooooooolte meno schermate blu dei 
sistemi Win9x/ME.
Non avranno semplicemente aggiunto una sfilza di "on error resume next"?
:)
-- 
Nella vita una sola cosa è certa: se la storia ci ha insegnato qualcosa, 
è che si può uccidere chiunque. (Micheal Corleone)

 modificando lbound, ma basta poi gestire correttamente il loop...
Uso la stessa tecnica e la trovo decisamente piů elegante dell'On Error.
Non si brucia niente poichč non serve un Redim Preserve: dato che l'array č
non-inizializzato lo si puň battezzare tranquillamente con un Redim
semplice.
Io preferisco addirittura usare gli elementi estremi dell'array, mica che a
qualcuno gli salta in mente che -1 gli serve :PP
Const ARRAY_NULL = &H7FFFFFFF& - 1
Redim Arr(ARRAY_NULL To ARRAY_NULL)
...
if Ubound(Arr) = ARRAY_NULL then
    Redim Arr(1 to 5)
    ...
end if
Un'alternativa puň essere quella di andare con ArrayPtr() e CopyMemory a
guardare il campo nCount del descrittore e se č a zero significa che non č
stato dimensionato, ma č un motodo puramente accademico :)
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net