Newsgroup: it.comp.lang.visual-basic
Titolo: [Banale?] Modificare un puntatore

Mi trovo a dover gestire un puntatore ad una locazione di memoria, il
problema č che l'api in questione (VirtualAlloc) mi restituisce un valore di
4 bytes in un Long. Ora, considerato che i long di VB hanno il segno, mi
chiedo, se provo ad aggiungere che so, 300 bytes con una semplice somma
(PuntatoreDefinitivo& = PuntatoreIniziale& + Delta&), non č che VB mi
interpreta male il segno e sballa i risultati?
Dalle prove che ho fatto sembrerebbe di sě.
Quindi ecco la domanda: come faccio a sommare tot bytes al valore di un
puntatore contenuto in un Long?

 puntatore contenuto in un Long?
Per ora faccio cosě, copio il long in un double shiftandolo di un byte,
faccio la somma e poi copio il risultato nella posizione originaria in un
long, per ora sembra funzionare, perň se esistesse un metodo piů
collaudato...
Private Function SommaDueUnsignedLong(In_Addendo1 As Long, In_Addendo2 As
Long) As Long
    Dim AddDBL1 As Double
    Dim AddDBL2 As Double
    Dim RisultatoDBL As Double
  'Ricava il nuovo puntatore.
    CopyMemory ByVal VarPtr(AddDBL1) + 1, In_Addendo1, 4
    CopyMemory ByVal VarPtr(AddDBL2) + 1, In_Addendo2, 4
    RisultatoDBL = AddDBL1 + AddDBL2
    CopyMemory ByVal VarPtr(SommaDueUnsignedLong), ByVal
VarPtr(RisultatoDBL) + 1, 4
End Function

 puntatore contenuto in un Long?
Lo sommi e basta. Anche se il valore long del puntatore ha il bit 31 (il segno)
settato, la sua rappresentazione in VB non potrà mai diventare positiva, a meno
di non sommargli un offset tale da fargli superare il limite fisico dei 4GB
anche da unsigned.
Es: Puntatore = &H80000000 
(-2147483648
 signed = 
2147483648
 unsigned)
Offset = &H7FFFFFFF 
(-2147483647
)
Somma = &HFFFFFFF (-1 signed = 4294967295 unsigned)
Non so se mi sono spiegato...
Bye
Raf

> Non so se mi sono spiegato...
Ehm, non sono sicuro di aver capito... comunque, in pratica l'unica cosa che
dovrei fare è controllare il segno giusto?
Una cosa tipo:
    If PuntatoreIniziale& < 0 Then
        PuntatoreDefinitivo& = PuntatoreIniziale& - Delta&
    Else
        PuntatoreDefinitivo& = PuntatoreIniziale& + Delta&
    End If


Memorizza il valore in una variant con CDec...?
Dim UnsLong as Variant, FinalLong as Long, QuelloCheGliDevoSommare as Long
QuelloCheGliDevoSommare = 300 ' ad esempio
UnsLong = CDec(Puntatore) ' puntatore contiene il tuo puntatore long
If UnsLong<0 Then UnsLong = (CDec(256)*256*256*256)+UnsLong ' Vado a memoria 
ma trasforma il valore negativo nel corrispondente valore positivo
UnsLong = UnsLong + QuelloCheGliDevoSommare ' occhio che non sfori
If UnsLong >= (CDec(128)*256*256*256) Then UnsLong = UnsLong - 
(CDec(256)*256*256*256)
FinalLong = CLng(UnsLong)
Ripeto, ho scritto di getto, va verificato.
La mia domanda è un altra...
Sei sicuro che sia saggio fare operazioni con un puntatore?
Un puntatore a 32bit non è un indirizzo fisico in memoria (questo funzionava 
sempre bene in dos), ma invece è una struttura che dice al processore a 
quale indirizzo di memoria protetta accedere (che poi lui rimappa come 
memoria fisica), non so quanto convenga aggiungere o sottrarre (magari dico 
una trollata), occhio a non uscire dalla memoria allocata (Ma memorizzare 
tutto in una ByteArray non vai meglio??)
Ciao Ric 

 ha scritto nel messaggio
news:6aAWe.3965$9l.9...@twister1.libero.it...

No, mi sono spiegato male... intendevo dire che se la somma del puntatore ed
offset non eccede &H7FFFFFFF, la "somma signed"
         PuntatoreDefinitivo& = PuntatoreIniziale& + Delta&
è sempre corretta.
Il problema è che se invece essa supera &H7FFFFFFF, non è che VB interpreti male
i risultati, ma dà proprio un errore di overflow.
Per evitare questo caso meglio passare ad un tipo di dato che possa meglio
contenere il risultato intermedio, tipo il Currency che è a virgola fissa.
(adattando il tuo tentativo con i Double):
Private Function SommaDueUnsignedLong(In_Addendo1 As Long, In_Addendo2 As Long)
As Long
Dim Somma As Currency
    Somma = (CCur(In_Addendo1) + CCur(In_Addendo2)) / 10000
    CopyMemory SommaDueUnsignedLong, Somma, 4
End Function
Bye
Raf

 Ma memorizzare tutto in una ByteArray non vai meglio??)
Il fatto è che si tratta di una situazione molto particolare, in pratica
l'API mi riempie un buffer che, a sua volta, è costituito da una
concatenazione di strutture di varia lunghezza, in ognuna di esse si trova
(tra le varie cose) il puntatore all'inizio della successiva, per cui, alla
fine, i puntatori dovrei utilizzarli ugualmente...

 l'API mi riempie un buffer che, a sua volta, è costituito da una
Azz... roba grossa, scus.... 

 casa sul mio compilatore nel desktop-Pc...
Ammetto che è terrificante, però per funzionare funziona (complimenti per il
coding on the fly :-)

 End Function
Ottimo :-) grazie davvero!!!

    CopyMemory SommaDueUnsignedLong, Somma, 4
Senza passare dalla copymemory credo basti aggiungere il "resto" a 
&H80000000, facendogli fare "il giro".
Ciao 

 Ciao
Ciao