Differenze tra le versioni di "Scrivere una libreria esterna che modifica un byte all'interno dell'area di memoria di una variabile"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "Nell'esempio che segue viene creata una libreria esterna dinamica condivisa .so contenente una funzione che modifica un byte all'interno dell'area di memoria di una variabile...")
 
 
(Una versione intermedia di uno stesso utente non è mostrata)
Riga 1: Riga 1:
 
Nell'esempio che segue viene creata una libreria esterna dinamica condivisa .so contenente una funzione che modifica un byte all'interno dell'area di memoria di una variabile di tipo Intero.
 
Nell'esempio che segue viene creata una libreria esterna dinamica condivisa .so contenente una funzione che modifica un byte all'interno dell'area di memoria di una variabile di tipo Intero.
  
Nella funzione esterna verrà utilizzata una ''Union'', contenente due soli membri: il primo un array di tipo ''char'' di 4 elementi (corrispondente in Gambas al tipo ''Byte''), il secondo membro di tipo ''int'' (corrispondente in Gambas al tipo ''Integer'').
+
Nella funzione esterna verrà utilizzata una "''[https://en.wikipedia.org/wiki/Union_type Union]''", contenente due soli membri: il primo un array di tipo ''char'' di 4 elementi (corrispondente in Gambas al tipo ''Byte''), il secondo membro di tipo ''int'' (corrispondente in Gambas al tipo ''Integer'').
  
 
Poiché nella ''Union'' i membri hanno identico indirizzo di memoria (corrispondente fra l'altro a quello della ''Union'' di appartenenza), il membro array ''char[4]'' viene a corrispondere nei suoi elementi ai 4 byte di memoria occupata dal secondo membro di tipo ''int''.
 
Poiché nella ''Union'' i membri hanno identico indirizzo di memoria (corrispondente fra l'altro a quello della ''Union'' di appartenenza), il membro array ''char[4]'' viene a corrispondere nei suoi elementi ai 4 byte di memoria occupata dal secondo membro di tipo ''int''.
Riga 8: Riga 8:
 
  Library "/tmp/lib"
 
  Library "/tmp/lib"
 
   
 
   
  <FONT Color=gray>' ''char * modmem (int v, char x, char n)''
+
  <FONT Color=gray>' ''int modmem (int v, char x, char n)''
 
  ' ''Modifica un byte all'interno dell'area di memoria di una variabile di tipo Intero.''</font>
 
  ' ''Modifica un byte all'interno dell'area di memoria di una variabile di tipo Intero.''</font>
 
  Private Extern modmem(v As Integer, x As Byte, n As Byte) As Integer
 
  Private Extern modmem(v As Integer, x As Byte, n As Byte) As Integer

Versione attuale delle 18:44, 2 apr 2017

Nell'esempio che segue viene creata una libreria esterna dinamica condivisa .so contenente una funzione che modifica un byte all'interno dell'area di memoria di una variabile di tipo Intero.

Nella funzione esterna verrà utilizzata una "Union", contenente due soli membri: il primo un array di tipo char di 4 elementi (corrispondente in Gambas al tipo Byte), il secondo membro di tipo int (corrispondente in Gambas al tipo Integer).

Poiché nella Union i membri hanno identico indirizzo di memoria (corrispondente fra l'altro a quello della Union di appartenenza), il membro array char[4] viene a corrispondere nei suoi elementi ai 4 byte di memoria occupata dal secondo membro di tipo int.

Così, dunque, modificando uno o più elementi dell'array char[4], si modificheranno i corrispondenti byte dell'area di memoria del membro di tipo int.

Library "/tmp/lib"

' int modmem (int v, char x, char n)
' Modifica un byte all'interno dell'area di memoria di una variabile di tipo Intero.
Private Extern modmem(v As Integer, x As Byte, n As Byte) As Integer


Public Sub Main()
 
 Dim origo, i As Integer
 Dim index, sost As Byte
  
  CreaSo()
  
  origo = &01020304
  index = 2
  sost = &88
  
  i = modmem(origo, index, sost)
  
  Print Hex(i, 8), i
  
End


Private Procedure CreaSo()
 
 File.Save("/tmp/lib.c", "union unione {\n"
           "   char c[4];\n" &
           "   int i;\n};\n\n"
           "union unione un;\n\n\n"
           "int modmem (int v, char x, char n) {\n\n" &
           "   un.i = v;\n\n" &
           "   un.c[x] = n;\n" &
           "   return un.i;\n\n}")
   
 Shell "gcc -o /tmp/lib.so /tmp/lib.c -shared -fPIC" Wait
 
End