Newsgroup: it.comp.lang.visual-basic
Titolo: arrayfill , Ubound, Lbound

C'era una volta la funzione Arrayfill, del Gfa Basic per Motorola 680xx.
Un pò per nostalgia e un pò perchè è una funzione di fatto utile, di tanto 
in tanto, ( con ReDim in VB noi possiamo soltanto inizializzare un array
al valore 0,  e a nessun altro valore ) mi sono proposto di realizzarla 
in un modulo .bas
Ne sono emersi numerosi problemi di generalizzazione ad array
multidimensionali:
 1) - è possibile conoscere il numero delle dimensioni di un array,
       e i rispettivi LBound & UBound ?
 2) - adottare una routine equivalente ad un Loop For Next ma che,
completamente
       generalizzata non faccia uso di annidamenti di For/Next.( questa per
la verità
       l'avrei già realizzata da molto tempo.  in un libro di Knuth si
affermava                                             l'impossibilità di
calcolare permutazioni e combinazioni senza far uso di
       annidamenti variabili di For/Next da invocare, ad esempio, con un
Select
       al variare di n, e da lì presi lo spunto per realizzare quanto sopra
)
.........
Per ora ho soltanto realizzato routine separate, per tipo e per numero di
dimensioni, e a dire il vero mi pare difficile arrivare alla unificazione
di
una funzione del genere. ( ho pensato al passaggio dei limiti superiori e
inferiori tramite un array )
Si accettano tutti i suggerimenti del benevolo uditorio.


La tua iniziativa è lodevole, ma non capisco perchè accanirsi sugli array
quando hai a disposizione le collection.
Per inciso, se si tratta di una ricerca a scopo di studio, mi interessano
moltissimo i suoi risvolti, ma dal punto di vista pratico...
... mi piacerebbe capire meglio dove vuoi arrivare.
Ciao. A.D.

 
mah, forse perchč non sono la stessa cosa!!!
secondo te perchč nelle stl ci sono sia vector sia map, tra gli altri?
--
Gio_F - mailto:
jg...@tiscalinet.it


Grazie per la precisazione, noto che hai colto il senso della mia domanda
(che non era assoluamente critica).
Ripeto, mi interessa molto il risvolto di questa ricerca, e seguirò con
attenzione le risposte alla discussione aperta da Mario.
Tuttavia, i mezzi per ottenere un risultato sono molti... (leggi il fine
giustifica i mezzi) :-)
Ciao. A.D.

 La tua iniziativa è lodevole, ma non capisco perchè accanirsi sugli array


Si accettano tutti i suggerimenti del benevolo uditorio.
1) Con LBound e UBound puoi comunque conoscere i limiti di ogni dimensione.
2) Per sapere le dimensioni di un array dopo qualche tentativo sono riuscito
a mettere insieme questa funzione (che usa un po' di api trovate grattando
il fondo dell'MSDN -acc!-):
Type SAFEARRAYBOUND
    cElements As Long
    lLbound As Long
End Type
Type SAFEARRAY
    cDims As Integer
    fFeatures As Integer
    cbElements As Long
    cLocks As Long
    pvData As Long
    rgsaBounds() As SAFEARRAYBOUND
End Type
Declare Function ArrayPtr Lib "msvbvm60" Alias "VarPtr" (ptr() As Any) As
Long
Declare Function CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As
Any, pSrc As Any, ByVal BytesLen As Long) As Long
Declare Function SafeArrayGetDim Lib "oleaut32.dll" (psa As SAFEARRAY) As
Long
'Use like this:
'Dim p(1,2,3) as Long
'ArrayDimensionCount(ArrayPtr(p()))
Function ArrayDimensionCount(lpA As Long) As Long
    Dim psa As SAFEARRAY
    Dim Dims As Integer
    Call CopyMemory(lpA, ByVal lpA, 4)
    Call CopyMemory(Dims, ByVal lpA, 2)
    ArrayDimensionCount = Dims
End Function
3) Non sono proprio riuscito riempire tutto un'array con un dato valore ma
farei così:
    tenterei di convertire l'array in un array monodimensionale di tipo byte
e userei l'api FillMemory()
Declare Function FillMemory Lib "kernel32" Alias "RtlFillMemory" (ByVal
Destination As Any, ByVal Length As Long, ByVal Fill As Byte) As Long
    oppure lo convertirei in un array monodimensionale del tipo
corrispondente e poi ci lavorerei sopra ancora con la FillMemory().
Controlla tutte le funzioni SafeArray* sull'MSDN, potrebbero tornarti utili.
Fammi sapere cosa riesci a fare!
P.S.: le collection sono utili solo se devi cercare un elemento per chiave
alfanumerica anzichè per indice, ma sono talmente lente che spesso non ne
vale la pena comunque.
Ciao

 alfanumerica anzichč per indice, ma sono talmente lente che spesso non ne


, 
a.de...@libero.it
 says...

è vero che spesso puoi scegliere tra collection e array. Ma se non hai 
elementi a chiave e la necessità dell'unicità degli items, non so che 
vantaggio hai nell'uso della collection, forse però è più pratica: se 
vuoi rimuovere un elemento non ti devi preoccupare di ricompattare la 
struttura.
Peraltro, la collection vb è un po' lentina. Ci sono in rete delle 
strutture più veloci (usano direttamente i puntatori (si può...) agli 
oggetti, insomma sono + ottimizzate. Una la ho trovata su 
http://www.domaindlx.com/e_morcillo
 
anzi quello era il link riportato, in realtà era su un altro sito. 
Comunque se non la trovi te la mando, sono pochi kb.
Tieni comunque presente comunque che le strutture a chiave sono in 
generale + lente di quelle puntate, e anche degli array (per alcuni 
aspetti): ognuna ha il suo scopo, devi considerare l'utilizzo prevalente, 
e in quale situazione è richiesta la massima velocità (inserimento, 
ricerca, modifica, cancellazione).
spero di esserti stato d'aiuto.


 Gio_F - mailto:
jg...@tiscalinet.it
Sì, ora sei stato d'aiuto. So che differenza c'è tra gli array e le
collection e che il calo di prestazioni nell'uso delle seconde è
elevatissimo (si demanda all'engine il compito di gestire i puntatori), ma
per come ho interpretato la richiesta iniziale di questa discussione,
credevo che il punto fosse proprio questo, cioè sapere quanta memoria stò
occupando in un certo istante nel mio insieme. Ora la gestione degli array
presenta una limitazione da questo punto di vista perchè nel dimensionare
l'array dovrei già conoscere il numero di elementi che utilizzerò nel mio
insieme, mentre spesso questa è un'incognita (quindi demando il compito a
strutture a chiave). Per questo motivo le strutture a chiave restituiscono
il numero di elementi presenti nell'insieme, mentre negli array lo devo
ricavare.
Comunque l'uso della prima o della seconda dipendono molto dal contesto in
cui devono operare, dallo scopo che si vuole raggiungere. A volte il calo di
prestazioni è giustificato. Del resto se si volessero sempre prestazioni
ottimali probabilmente ci si orienterebbe verso linguaggi a basso livello
incrementando proporzionalmente i costi di produzione mentre nella maggior
parte dei casi si cerca un buon compromesso oppure si costruisce una
struttura che risolva il problema e che soddisfi in maniera esaustiva le
nostre esigenze come per esempio le strutture ottimizzate che hai
giustamente suggerito e per le quali ti ringrazio. ;-)
Ciao. A.D.

 
-- 
