Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Puntatori ad array, me ne serve solo uno!!!

Salve a tutti,
vengo subito al dunque:
devo copiare in un LONG il PUNTATORE ad un array di 16 Long, fatto in VB.
Dim MyArray(16) As Long
Dim lpMyArray As Long  ' deve contenere un puntatore
Dovrei fare:
lpMyArray = <puntatore di MyArray>
ovviamente:
lpMyArray = MyArray        ' NO = tipo non corrispondente
lpMyArray = MyArray(0)   ' NO = copia il valore del primo long dell'array
Ho provato anche con le API GlobalAllock, GlobalLock e
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest
As Any, hpvSource As Any, ByVal cbCopy As Long)
Ma all'istruzione:
    CopyMemory ByVal lpMyArray, MyArray, 16 * 4
mi da ancora errore di tipo non corrispondente su MyArray.
Qualcuno mi sa spiegare come posso fare?
In C o Pascal sarebbe stato semplicissimo :-(
Ringrazio in anticipo
--
Roal Zanazzi
z...@iol.it

...


mi da ancora errore di tipo non corrispondente su MyArray.
La soluzione più semplice è quella di scriverti una dll che accetta come
parametro un puntatore e lo restituisce come valore.
qualcosa del tipo
long _stdcall RestituisciPuntatore(long* MyArray)
{
    return (long)MyArray;
};
In vb dovresti crearti un puntatore ad un array, utilizzando le funzioni
Global
es MyArray as long
    MyArray = GlobalLock(GlobalAlloc(GMEM_FIXED, 16*4))
    Il valore contenuto in MyArray è adesso un indirizzo di memoria
Per riempiere l'array modifica l'istruzione CopyMemory nel seguente modo
Declare Sub RiempiArray Lib "kernel32" Alias "RtlMoveMemory" (byval lpvDest
As long, hpvSource As Any, ByVal cbCopy As Long)
N.B. poichè lpvDest è passato ByVal alla RtlMoveMemory gli arriva il
valore(puntatore)
RiempiArray MyArray + 4*x, source, 4
(assegno all'indirizzo del generico elemento x, il valore contenuto in
source)
Per ricavare il generico elemento x del mio array, modifico l'istruzione
CopyMemory nel seguente modo
Declare Sub RestituisciArray Lib "kernel32" Alias "RtlMoveMemory" (lpvDest
As any, byval hpvSource As long, ByVal cbCopy As Long)
N.B. in questo caso passo hpvSource per valore
ResrituisciArray source, MyArray + 4*x, 4
(Assegno alla variabile source il valore contenuto all'indirizzo MyArray +
4*x)
Ciao Bruno


Non ho mai provato, ma forse funziona.
Prova ad usare l'API:
Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynA" (lpString1 As
Long, lpString2 As long, ByVal iMaxLength As Long) As Long
in questo modo:
    lpMyArray = lstrcpyn( MyArray(0), MyArray(0), 4 )
Il -MES- Dal lavoro
Ettore Maronese

Il vb5 ha ancora VarPtr che restituisce un puntatore (vero,cioč un long)
alla variabile passata come argomento,a questo punto l'assegnazione la puoi
fare alla solita maniera
lpMyArray=VarPtr(MyArray(0))
Domenico,tu che pensi ?
Carlo

Il vb5 ha ancora VarPtr che restituisce un puntatore (vero,cioè un long)


...


Il vb5 ha ancora VarPtr che restituisce un puntatore
Bella questa funzione. Dove l'hai trovata? Non l'ho trovata documentata da
nessuna parte.
Esiste l'inversa (dato un puntatore mi restituisce il valore)?
Ciao Bruno

...


Varptr non č documentata. L'inverso lo puoi avere con RTLMoveMemory


lpMyArray=VarPtr(MyArray(0))
FUNZIONA!!!!!!! Bravo Carlo B!
Eventuali controindicazioni nell'uso di VarPtr?
Inoltre la soluzione e' perfetta, perche' passo a lpMyArray il puntatore
diretto al mio array, non il puntatore ad un blocco di memoria che dovrei
allocare, copiare (e qui dovrebbe andare bene CopyMemory()) e deallocare.
--
Roal Zanazzi
z...@iol.it

 
Sti bas...di della M$, che non documentano sti gioielli!!!!
Al Rogo......  (figurativo)
-- 
Hi, Ciao
Ettore                 By -MES-
http://freeweb.aspide.it/freeweb/ilmes
 
(con OCX per stampare i Recordset)
Il sito comune di programmatori VB
http://members.xoom.com/it_lang_vb

 common dialog... cosi' sapete anche cosa sto facendo, hi, hi, hi :-)))
FALSO, DEVE ANDARE!
Per il semplice motivo che l'ho appena provato e funziona.
Tu probabilmente non hai usato la dichiarazione che ti ho postato io, ma l'hai presa dall' "Api Text Viewer". Io l'ho
leggermente modificata, togliendo i due Byval che mi davano fastidio.
Io ho fatto cosi', e funziona.
Private Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynA" (lpString1 As Long, lpString2 As Long, ByVal iMaxLength As
Long) As Long
Private Sub Form_Load()
 
    Dim lpMyArray   As Long
    Dim lpMyArray2  As Long
    Dim MyArray()   As Long
 
    ReDim MyArray(30)
    MyArray(0) = 123	' non serve
    MyArray(1) = 345	' non serve
 
    lpMyArray2 = VarPtr(MyArray(0))
    lpMyArray = lstrcpyn(MyArray(0), MyArray(0), 4)
    Debug.Print lpMyArray2 & " : " & lpMyArray
 
End Sub
In qualsiasi caso, la VarPtr() e' sicuramente LA soluzione. (ho gia' detto quello che penso sul fatto che la M$ nasconde
queste funzioni).



Io lo dico adesso:
SONO DEI BASTARDI !
--
Roal Zanazzi
z...@iol.it

a proposito delle funzioni VarPrt e compagnia bella...
sul numero 20 di Visual basic Journal si trova una estesa spiegazione
dell'uso
di questi strumenti
(scusate il ritardo, ma non mi danno la casella di posta, sono tuttora
ospite)
Luigi