Newsgroup: it.comp.lang.visual-basic
Titolo: Array & CopyMemory

Sono interessato a sapere come sia possibile leggere e scrivere
dati in un Array con numero di dimensioni arbitrario, e a conoscere
dove vengono memorizzati i dati degli array e in che modo.
Ho provato con CopyMemory (), ma non sono riuscito nell'intento.
I dati che leggo non coincidono nè con quelli che assegno direttamente
da VB agli array, nè con quelli che tento di scrivere.
molto grato per un chiarimento esaustivo del problema.
ramarro.

da VB agli array, nč con quelli che tento di scrivere.
In questi giorni sto studiando queste tecniche, ma non ho capito molto bene
la tua domanda.
Fammi un esempio di quello che vorresti ottenere.
Comunque gli array (non di stringhe che sono leggermente diversi) sono
strutturati cosě:
Type SAFEARRAYBOUND
    cElements As Long ' numero di elementi x la dimensione
    lLbound As Long ' lo stesso di UBound() x la dimensione
End Type
Type SAFEARRAY
    cDims As Integer ' numero di dimensioni
    fFeatures As Integer ' dice se č dinamico, statico ecc...
    cbElements As Long ' Dimensione del singolo elemento nell'array
    cLocks As Long ' indica se l'array č lockato
    pvData As Long 'Boh, dovrebbe essere il puntatore ai dati
    rgsaBounds1 As SAFEARRAYBOUND ' elementi e UBound() della 1^ dimensione
    ...
    rgsaBoundsN As SAFEARRAYBOUND ' elementi e UBound() della n-esima
dimensione
End Type
    SAFEARRAY
    SAFEARRAYBOUND (tanti quante sono le dimensioni dell'array)
    <Dati dimensione 1>
    <Dati dimensione 2>
    ...
    <Dati dimensione n>
Se usi la ArrayPtr()
Declare Function ArrayPtr Lib "msvbvm60" Alias "VarPtr" (ptr() As Any) As
Long
ottieni il puntatore al descrittore (cioč al puntatore della struttura
SAFEARRAY)
es:
Per ottenere il safearray di un'array devi fare
    Dim psa As SAFEARRAY
    Dim lpA As Long
    Dim lpA2 As Long
    lpA = ArrayPtr(MyArray()) 'Puntatore al descrittore
    Call CopyMemory(lpA2, ByVal lpA, 4) 'Puntatore alla SAFEARRAY
    Call CopyMemory(psa, ByVal lpA2, Len(psa)) 'struttura SAFEARRAY
Ciao

 
SAFEARRAY cos'è? un tipo di variabile ? .....
.cbElements, che non è definito, e presumibilmente corrisponde
a Len(a(x,y,z)), in questo caso (4), che cos'è.
lo stesso per .pvData ( che presumo corrisponda al puntatore ad a(0,0,0) )
ciao 
ramarro


Hai, hai... allora non ascolti!
Nel mio primo messaggio ti avevo indicato la <struttura> SAFEARRAY.
Te la RE-indico: (con correzione sui commenti)
Type SAFEARRAYBOUND
    cElements As Long ' numero di elementi x la dimensione
    lLbound As Long ' lo stesso di LBound() x la dimensione
End Type
Type SAFEARRAY
    cDims As Integer ' numero di dimensioni
    fFeatures As Integer ' dice se è dinamico, statico ecc...
    cbElements As Long ' Dimensione del singolo elemento nell'array
    cLocks As Long ' indica se l'array è lockato
    pvData As Long 'Puntatore ai dati
    rgsaBounds1 As SAFEARRAYBOUND ' elementi e LBound() della 1^ dimensione
    ...
    rgsaBoundsN As SAFEARRAYBOUND ' elementi e LBound() della n-esima
dimensione
End Type
Type SAFEARRAYHEADER
    cDims As Integer ' numero di dimensioni
    fFeatures As Integer ' dice se è dinamico, statico ecc...
    cbElements As Long ' Dimensione del singolo elemento nell'array
    cLocks As Long ' indica se l'array è lockato
    pvData As Long 'Puntatore ai dati
End Type
Ciao