Newsgroup: it.comp.lang.visual-basic
Titolo: Come contare elementi di array?

Salve,
come posso sapere quanti elementi sono presenti in un array?
Grazie

>come posso sapere quanti elementi sono presenti in un array?
Prova con
Split (guarda sulla guida)
Saluti...
--------------------------------
Inviato via 
http://usenet.iol.it
 

Dato che non so come passare un array ad una funzione (chi lo sapesse me lo potrebbe
dire?), la variabile NomeArray e' globale....
UBound va in errore con array non inizializzati...
Private Function UpperBound() As Long
  On Error GoTo UBoundError
  UpperBound = UBound(NomeArray)
Exit Function
UBoundError:
  UpperBound = -1
End Function


 UBound va in errore con array non inizializzati...
Passalo come variant. La dichiarazione diventa:
Private Function UpperBound(NomeArray As Variant) As Long
Ciao
*Roby*
P.S.
Cosě ti ritorna -1 anche se non gli passi un array.

 come posso sapere quanti elementi sono presenti in un array?
Option Explicit
Private Function GetArrayItemsCount( _
  ByVal a As Variant _
) As Long
  On Error Resume Next
  GetArrayItemsCount = UBound(a) - LBound(a) + 1
End Function
Private Sub Main( _
)
  Dim a_1
  Dim a_2()
  Dim a_3(11 To 20)
  Dim a_4(1 To 2, 11 To 20)
  Debug.Print GetArrayItemsCount(a_1)
  Debug.Print GetArrayItemsCount(a_2)
  Debug.Print GetArrayItemsCount(a_3)
  Debug.Print GetArrayItemsCount(a_4)
End Sub
  ... ma considera il caso particolare "a_4". (E visita anche il sito
vb2themax.)
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

Grazie!


Ecco la mia alternativa:
'Use:  ArrayElementCount(ArrayPtr(p()))
Function admArrayElementCount(lpA As Long, ByVal Dimension As Long) As Long
    Dim lpA2 As Long
    Call CopyMemory(lpA2, ByVal lpA, 4)
    Call CopyMemory(admArrayElementCount, ByVal lpA2 + 16 + ((Dimension - 1)
* 8), 4)
End Function
Ciao

 ha scritto nel messaggio
news:3ae78...@news.bluewin.ch...


 Grazie!
Puoi anche passarlo direttamente come array, senza transitare dal Variant,
usando questa sintassi:
Private Function Test(TestArray() As Long) As Long
Test = TestArray(0)
End Function
nota che non puoi specificare 'ByVal' nel parametro.
Ciao
--
Luca Dormio
luca....@tin.it

 Private Function Test(TestArray() As Long) As Long
Vero, ma cosě lo devi per forza tipizzare. Nel caso in oggetto si trattava
di lavorare con un array non conosciuto a priori.
Comunque alla fine Maurizio Borrelli ha tirato giustamente fuori il caso
possibile dell'array multidimensionale, e quindi la generalizzazione č
andata comunque a farsi friggere. 8-)
Ciao
*Roby*

Grazie! :)

 Comunque alla fine Maurizio Borrelli ha tirato giustamente fuori il caso
possibile dell'array multidimensionale, e quindi la generalizzazione č
andata comunque a farsi friggere. 8-)
Accrocchiando sempre di piu` le cose ce la si potrebbe cavare con:
Option Explicit
Private Function GetArrayItemsCount2( _
  ByRef a As Variant _
) As Long
  On Error GoTo Err
  Dim lngDims As Long
  GetArrayItemsCount2 = UBound(a) - LBound(a) + 1
  lngDims = 2
  Do
    GetArrayItemsCount2 _
      = UBound(a, lngDims) - LBound(a, lngDims) + 1
    lngDims = lngDims + 1
  Loop
  Exit Function
Err:
End Function
Private Sub Main( _
)
  Dim a_1                   As Long
  Dim a_2()                 As Long
  Dim a_3(1 To 2000000)     As Long
  Dim a_4(1 To 2, 3 To 4, 11 To 20) As Long
  Debug.Print Format$(GetArrayItemsCount2(a_1), "#,##0")
  Debug.Print Format$(GetArrayItemsCount2(a_2), "#,##0")
  Debug.Print Format$(GetArrayItemsCount2(a_3), "#,##0")
  Debug.Print Format$(GetArrayItemsCount2(a_4), "#,##0")
End Sub


 ha scritto nel messaggio
news:a1QF6.907$Hp1....@news2.tin.it...


 ha scritto nel messaggio
news:3ae78...@news.bluewin.ch...


Split (guarda sulla guida)
passa a Delphi... basta un Length(ArrayOStringa)...
(muhahahahahahahahahaha!)
comunque si usano UBound e LBound

andata comunque a farsi friggere. 8-)
Scusate, ripeto la mia soluzione che probabilmente non è stata letta:
Non ha problemi di tipo e di dimensione.


 End Function
Beh, Zanna, se e` per questo nemmeno tu hai mostrato di aver letto,
attaccandoti al mio post, che scrivevo:
  "(E visita anche il sito vb2themax.)"
dove, come noto da tempo a questo ng, e` presente qualcosa di molto simile
al tuo codice.
 
http://www.vb2themax.com/Item.asp?PageID=TipBank&Cat=130&ID=27



Potevi dirlo subito!
Peccato che sia un bel 404! :(
Ciao

> Zanna:

Bisogna aver pazienza e ritentare. La rete e` imperfetta, cioe` molto umana.
Io ci sono arrivato seguendo questo link:
http://groups.google.com/groups?q=array+group:it.comp.lang.visual-basic+auth
or:borrelli&num=100&hl=en&lr=&safe=off&scoring=relevance&rnum=4&ic=1&selm=88
2hdc%24e0u%244%
40nslave1.tin.it
--
Ciao ;-)


 Non ha problemi di tipo e di dimensione.
Pur trovandola geniale non sono sicuro di aver capito come funziona.
Praticamente copia i primi 4 byte dell'array che contengono un Long, e lo
usa come spiazzamento, assieme al numero di dimensioni, per copiarsi un
altro long che contiene il numero di elementi.
Bisognerebbe conoscere approfonditamente la struttura interna degli array
VB. Mi pare di ricordare che Hal ne aveva postato l'header un po' di tempo
fa. Ma dove si trova sulla documentazione?
Ciao
*Roby*
P.S:
Dubbio: siamo sicuri che con 
VB.NET
 non cambi il sistema interno di gestione
degli array?

degli array?
Con M$ non si sa mai, ma non dovrebbe poichč non sono gli array di VB, sono
un tipo di array studiato apposta per essere dimensionabile e per avere al
suo interno tutte le informazioni relative all'array stesso.
Ciao

 il sistema interno di gestione degli array?
Cambia, anzi e' del tutto diverso.
Ciao.

H.P.L. ha scritto nel messaggio ...

Come?
Documentazione?
Ciao

 Documentazione?
.NET abbandona COM e pertanto i safearray. Ora tutti gli array (in tutti
i linguaggi .NET) sono istanze della classe Array della BCL (base class
library).
http://msdn.microsoft.com/library/default.asp?URL=/library/dotnet/cpref/
frlrfSystemArrayClassTopic.htm
Ciao.

frlrfSystemArrayClassTopic.htm
Beh, quindi immagino saranno di per sè più semplici da gestire (e ovviamente
più lenti :( )
Ciao

 da gestire (e ovviamente più lenti :( )
Dimenticavo che la M$ ha fatto un passo indietro sugli array per
cui le cose potrebbero essere diverse (ma non credo).
Comunque, da prove fatte con la beta 1 (nella quale gli array sono, come
ho detto, istanze della classe Array), le differenze in termini di
prestazioni sono minime, a fronte di una molto maggiore praticita',
semplicita' d'uso e flessibilita', che sono le cose che contano
veramente. Impiegare uno o due secondi a compiere una serie di calcoli
complessi o impiegare 1 millisecondo (essere quindi ben migliaia di
volte piu' veloce) nella maggior parte dei casi non porta a reali
vantaggi. Avere a disposizione maggiori facilita', potenza e
flessibilita' e' decisamente molto meglio. A livello di prestazioni
l'importante non e' essere il piu' veloci possibili (salvo alcuni casi
per cui, oltretutto, difficilmente si usera' il VB) ma rimanere entro
certi limiti. Nel caso che ho accennato sopra un tempo di qualche decina
di secondi probabilmente non sarebbe piu' accettabile.
Ciao.

Scusate, pero' anche usando questa funzione non e' possibile conoscere
le dimensioni di array di tipo definito dall'utente... o mi sbaglio??
Ciao
mau_rizio

le dimensioni di array di tipo definito dall'utente... o mi sbaglio??
Funziona con tutti i tipi.
Credo però che gli array debbano essere dichiarati con Redim e non con Dim.
Ciao

flessibilita' e' decisamente molto meglio.
Non sono molto d'accordo, ma non importa (mi troverei spesso ad avere una
classe con un mucchio di metodi per gestire l'array che non mi servono a
niente in cambio di una velocità minore).
Quello che inizia a preoccuparmi è che i linguaggi diventano sempre più ad
alto livello, ed il rischio è di programmare senza sapere cosa c'è "under
the hood".
Gli unici che continueranno a sapere veramente quello che fanno saranno i
programmatori M$, e questo mi spaventa un po'.
Ciao

programmatori M$, e questo mi spaventa un po'.
Si', ma allora non usi visual basic.
Al giorno d' oggi, con i ristretti tempi di delivery che si hanno, un linguaggio
che permetta di astrarre dalla macchina, permettendo di focalizzare l' attenzione
sulla soluzione delle esigenze del cliente, e' sicuramente il benvenuto.
In fin dei conti, una delle ragioni del successo di visual basic e' proprio questa.
Scriviti un ' interfaccia grafica in C per un programma di contabilita'.
Sono d' accordo che la puoi fare come vuoi, ma quando vai dal cliente
a consegnare l' applicazione scopri che nel frattempo ne ha gia' comprata
un' altra :-)
Il conoscere cosa succede sotto il cofano e' sicuramente utile per utilizzare
al meglio il linguaggio ad alto livello, ma una cosa e' fare il pilota, l' altra e' fare il
il meccanico. Sono due mestieri diversi, entrambi complementari, ma diversi,
che hanno obiettivi diversi.
Il tutto e' imho
ciao, hal