Newsgroup: it.comp.lang.visual-basic
Titolo: Manipolazione di array in VB

Salve,
vorrei sapere come poter gestire velocemente (nel senso che deve essere
veloce l'esecuzione del codice) una quantità abbastanza elevata di Array in
VB.
In questi array devo togliere il primo elemento, shiftare gli altri di una
posizione verso l'altro e poi inserire nell'ultima posizione (che rimane
vuota ) un valore.
Volevo fare una DLL in C ma poi mi è venuto in mente che posso usare la
CopyMemory, ma non riesco a fare quello che voglio. L'idea era:
creo un array temporaneo con gli stessi elementi del primo, copio l'intero
array su quello temporaneo partendo dal 2 elemento dell'array originale,
aggiungo il dato all'array temporaneo e infine copio l'array temporaneo su
quello originale.
tutto questo lo vorrei fare senza cicli, usando quindi la CopyMem, ma come
devo  fare ????

...


 wrote in message
news:7n26o0$ocl$1...@nslave1.tin.it...


you wrote :
#Ma perchč vi dovete complicare la vita a fare tutte queste cose messe
#insieme dico io?
Resta il fatto, comunque, che la tua non e' una risposta alla domanda
"come shiftare un array in modo veloce ?".
Supponendo che egli voglia implementare l'array come una coda, con il
tuo metodo non e' possibile farlo, cioe' muovere gli elementi in
avanti ed inserire nella posizione 1000 un nuovo elemento.
Andrea Laforgia        (
andrea_...@bigfoot.com
)
----------------------------------------------------
There is nothing better for understanding a kangaroo
than seeing it jump.
----------------------------------------------------

Piuttosto che utilizzare CopyMemory ti conviene utilizzare la funzione
RtlMoveMemory, questa ti consenti di spostare un blocco di byte da una
posizione ad un'altra  senza
problemi di sovrapposizione.
Private Declare Sub RtlMoveMemory Lib "Kernel32" (dest As Any, src As Any,
ByVal nByte As Long)
Breve esempio
    ' creo una matrice di 11 elementi
    Dim MyArray(0 to 10) As Long
    ' popolo l'array
    Dim i As Long
       For i = 0 To 10
            MyArray(i) = i
    Next i
    ' scalo la posizione degli ultimi 10 elementi dell'array
    Call RtlMoveMemory(MyArray(0), MyArray(1), 4 * 10)
    ' ora MyArray(0)=1
    MyArray(10) = 100    ' inserisco il nuovo valore nell'ultimo elemento
    ' visualizzo l'array
    For i = 0 To 10
            Debug.Print MyArray(i)
    Next i
Spero di essere stato chiaro
Ciao Bruno


"come shiftare un array in modo veloce ?".
allora sono d'accordo (in parte).
Enjoyyyyyyyyyyyyyyyy!!!

 
 
Non si puň usare ReDim per shiftare, infatti per conservare i dati
durante la modifica dell'arrey bisogna usare l'opzione Preserve insieme
a ReDim (altrimenti si perde tutto O_O). E Preserve non ti permette di
modificare il limite inferiore della matrice, ma solo quello superiore.
Quindi puoi aumentare e diminuire il numero di elementi ma il primo
rimane sempre il primo. Oltretutto avendo metrici con piů dimensioni con
Preserve puoi modificare solo il limite superiore dell'ultima
dimensione.
Ciao
:-) Hd (-:

you wrote :
#Non capisco perchč si debbano "spostare" dei dati, PERCHE'?
#Dov'č la necessitŕ? stiamo facendo una routine grafica forse?
Ma scusami tanto, a te che te ne importa ?
Se lui ti chiede come shiftare i dati in modo veloce, diglielo e
basta, senza fare commenti del tipo "e a che ti serve ???".
O no ? ;)


 wrote in message
7n23bb$l4$1...@nslave1.tin.it...


 wrote in message
news:7n23bb$l4$1...@nslave1.tin.it...


devo  fare ????
Puoi farlo addirittura con un unico array:
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
 (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Declare Sub ZeroMemory Lib "kernel32" Alias "RtlZeroMemory" _
 (dest As Any, ByVal numbytes As Long)
Sub ShiftArray()
Dim arValues() As Long
Dim ValuesCount As Long, i As Long, Index As Long
Dim ItemLen As Long
'inizializziamo l'array
ReDim arValues(1 To 10)
For i = 1 To 10
    arValues(i) = i
Next
ValuesCount = UBound(arValues)
'scegliamo l'elemento da cancellare e
'stabiliamo l'occupazione in bytes del singolo elemento
'(questo in generale; in questo caso e' ridondante visto
'che sappiamo gia' che un long e' 4 bytes...)
Index = 1
ItemLen = Len(arValues(Index))
'shiftiamo a sinistra gli elementi dell'array e "ripuliamo" l'ultimo elemento
CopyMemory ByVal VarPtr(arValues(Index)), _
 ByVal VarPtr(arValues(Index + 1)), _
 (ValuesCount - Index) * ItemLen
ZeroMemory ByVal VarPtr(arValues(ValuesCount)), ItemLen
End Sub
Ciao
--
Luca Dormio
l...@sig-la.com
ldo...@tin.it