View Full Version : VB6 array
Joblack84
24-06-2006, 14:58
come posso ottenere il numero di elemnti di un array?
Con il metodo Ubound(nomeArray)
Joblack84
24-06-2006, 15:10
Con il metodo Ubound(nomeArray)
cosi mi da la lungezza dell'array no gli elementi che sono inseriti as esempio
dim nomearray(9) as integer
nomearray(0) = "var1"
nomearray(1) = "var2"
Ubound(nomearray) mi dara 9 e non 2 spero di essermi spiegato
Che sappia io non c'è un metodo che restituisca il numero effettivo di elementi presenti in un array (o almeno non lo ricordo).
Quelle volte che mi serve faccio un ciclo for con un contatore che incremento in base che la posizione sia diversa da "" (in caso di array di stringhe) o 0 (in caso di array numerici).
Oppure puoi adattarti dinamicamente l' array in base a quanti oggetti devi inserirci ...
Ad esempio se hai un array di 2 elementi e devi inserirne un altro, puoi usare i comandi:
i = ubound(nomearray)
redim preserve nomearray(i+1)
così da ridimensionare l' array (redim) col numero di elementi che vuoi (in questo caso 1 in più di prima) e con la proprietà preserve mantieni gli elementi già presenti nelle loro posizioni.
In questo modo puoi sempre sfruttare il metodo uboud(nomearray) per sapere l' ultimo indice, senza dover fare ogni volta un ciclo for e contare fino a quando non trovi posizioni "" o 0 (ma anche così può non funzionare, nel caso avessi proprio un oggetto di quei valori).
Ho cercato nei vecchi manuali che usavo prima della certificazione ed in effetti consigliano l' uso del redim con o senza preserve (in base ai casi).
Nel .net è stata aggiunta un proprietà che indica anche il numero di oggetti effettivamente presenti.
Stiwy.NET
27-06-2006, 11:20
Nel .net è stata aggiunta un proprietà che indica anche il numero di oggetti effettivamente presenti.
Ahh si? :eek: E come si chiama? :confused:
Ops, mi sono confuso con la proprietà Lenght del vb.net ... ho avuto un lapsus, non riporta il numero effettivo di elementi, ma semplicemente la dimensione totale dell' array (in pratica ubound + 1).
Chiedo venia per l' ultima frase errata :cry:
Stiwy.NET
27-06-2006, 13:03
Ops, mi sono confuso con la proprietà Lenght del vb.net ... ho avuto un lapsus, non riporta il numero effettivo di elementi, ma semplicemente la dimensione totale dell' array (in pratica ubound + 1).
Chiedo venia per l' ultima frase errata :cry:
Peccato, l'avrei trovata comoda :D
wingman87
27-06-2006, 13:15
Ma se nell'array (dinamico) non c'è nulla come si fa? Se uso l'ubound mi da errore, non c'è un modo x sapere prima se c'è almeno un elemento nel vettore? A parte tenere un contatore..
Stiwy.NET
27-06-2006, 13:17
Ma se nell'array (dinamico) non c'è nulla come si fa? Se uso l'ubound mi da errore, non c'è un modo x sapere prima se c'è almeno un elemento nel vettore? A parte tenere un contatore..
If isnothing(vettore) then 'è vuoto...
else
ubound(vettore)
end if
No, per poter usare un array devi sempre e solo dichiararlo dicendogli anche quante posizioni deve avere.
Puoi cambiare poi la sua dimensione con l' istruzione redim, mentre se vuoi anche mantenere gli elementi che possiede, ci aggiungi la proprietà preserve.
Quando dichiari un array (dimensionato con un tot di elementi):
dim a(5) as integer
il vb lo inizializza già con tutti gli elementi a 0 (se array numerico) o a "" (se stringa) ... quindi ubound funzionerà sempre ... però non sai quanti elementi effettivi ci sono dentro ...
L' unica è costruirti una funzione apposita che te li calcola ...
Puoi usare un trucchetto, mettere come ultimo elemento dell' array un terminatore (* o un simbolo che non userai mai) ... così quando cicli, conti la posizione del terminatore ...
Purtroppo ... è così ...
Giusto oggi ho creato un array 'infinito'
Dim matrice() as String
Poi con un'istruzione Split l'ho popolata
Matrice = Split (variabile, "\")
dove variabile è così composta "C:\cartella\cartella2\cartella3"
Con UBOUND vedi quanti elementi di questa matrice hai popolato.
(praticamente mi ritorna 4, perchè ha gli elementi dallo 0 al 3 popolati).
Stiwy.NET
27-06-2006, 14:04
Giusto oggi ho creato un array 'infinito'
Dim matrice() as String
Poi con un'istruzione Split l'ho popolata
Matrice = Split (variabile, "\")
dove variabile è così composta "C:\cartella\cartella2\cartella3"
Con UBOUND vedi quanti elementi di questa matrice hai popolato.
(praticamente mi ritorna 4, perchè ha gli elementi dallo 0 al 3 popolati).
e allora? :mbe:
No, vedi sempre la grandezza dell' intero array (o meglio l' indice dell' ultimo elemento (popolato o no) dell' array) ...
Split è una funzione particolare che ridimensiona il vettore iniziale in base a quanti spezzoni vengono restituiti ...
Eh eh, io e Stiwy siamo sempre in sintonia :sofico:
wingman87
27-06-2006, 14:20
If isnothing(vettore) then 'è vuoto...
else
ubound(vettore)
end if
non mi funziona la funzione isnothing, dove l'hai presa?
Stiwy.NET
27-06-2006, 14:21
Eh eh, io e Stiwy siamo sempre in sintonia :sofico:
Probabilmente perchè entrambi lavoriamo con VB.NET... o simili... :O
Stiwy.NET
27-06-2006, 14:22
non mi funziona la funzione isnothing, dove l'hai presa?
isnothing è di VB.NET... prova con isNull oppure a mettere
if vettore is nothing then
wingman87
27-06-2006, 14:34
Non mi funziona nessuna delle due, può essere che sia perchè le sto usando con un array di record?
Come ho spiegato nei primi post .. in vb6 quando si dichiara un array (con la dimensione), le varie posizioni vengono impostate coi valori "zero" del tipo di dato dell' array ...
Se è un array di numeri, vengono inizializzati a 0; se sono stringhe vengono inizializzati a "" ... lo stesso per array di altri tipi di dato ...
wingman87
27-06-2006, 14:45
Ma se nell'array (dinamico) non c'è nulla come si fa? Se uso l'ubound mi da errore, non c'è un modo x sapere prima se c'è almeno un elemento nel vettore? A parte tenere un contatore..
Il mio array è dinamico, si vede che ti è sfuggito :)
In vb6 gli array dinamici sono semplicemente array statici che puoi regolare con redim (magari assieme a preserve) ...
O un' altra definizione è quella di un array statico non dimensionato ...
Quindi istruzioni come ubound, lbound, etc etc danno errore se usati con array non dimensionati ...
Chiamalo limite di VB6 ... o chiamala feature del VB6 :D
wingman87
27-06-2006, 15:35
Ma fino a un momento fa io credevo che la differenza tra array statici e array dinamici fosse proprio la non possibilità o la possibilità di ridimensionarli runtime. A sto punto mi puoi spiegare qual è la differenza?
Gli array in vb6 sono semplicemente array ...
Se nella dichiarazione imposti anche una dimensione li puoi chiamare statici; se invece non imposti la dimensione allora sono dinamici in quanto puoi ridimensionarli come vuoi ...
Il problema è che puoi accere agli array (TUTTI) solo se sono dimensionati!!!! quindi un array statico puoi accedergli anche se non hai fatto nessuna assegnazione ... un array dinamico invece puoi accedergli solo l' hai dimensionato (con un redim, oppure assegnandogli dei valori tramite funzioni che restituiscono un array ... e quindi si ridimensiona in automatico).
Il fatto è che anche un array statico può essere ridimensionato nuovamente con redim ... quindi in vb tutti gli array sono array e basta ... sono i manuali che distinguono tra statico e dinamico, ma solo per scopo didattico, alla fine possono essere la stessa cosa ...
wingman87
27-06-2006, 16:00
Il fatto è che anche un array statico può essere ridimensionato nuovamente con redim ...
Questo è interessante, quindi x risolvere il mio problema potrei dichiarare un array di un solo elemento e quando faccio il primo inserimento non ridimensionare, nei successivi invece sì. Giusto? Peccato che ora non sono a casa e non posso provare, stasera provo. Grazie!
Stiwy.NET
27-06-2006, 16:11
Questo è interessante, quindi x risolvere il mio problema potrei dichiarare un array di un solo elemento e quando faccio il primo inserimento non ridimensionare, nei successivi invece sì. Giusto? Peccato che ora non sono a casa e non posso provare, stasera provo. Grazie!
tra l'altro questa è stata proprio una delle prime proposte che ti sono state fatte :p
wingman87
27-06-2006, 16:26
tra l'altro questa è stata proprio una delle prime proposte che ti sono state fatte :p
:doh: Sì è vero, solo che non capivo perchè non sapevo si potesse ridimensionare gli array "statici"
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.