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...")
 
 
(2 versioni intermedie di uno stesso utente non sono mostrate)
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
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim origo, i As Integer
 
   Dim origo, i As Integer
 
   Dim index, sost As Byte
 
   Dim index, sost As Byte
 
    
 
    
  CreaSo()
+
  CreaSo()
 
    
 
    
  origo = &01020304
+
  origo = &01020304
  index = 2
+
  index = 2
  sost = &88
+
  sost = &88
 
    
 
    
  i = modmem(origo, index, sost)
+
  i = modmem(origo, index, sost)
 
+
 
  Print Hex(i, 8), i
+
  Print Hex(i, 8), i
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Procedure CreaSo()
+
  Private Procedure CreaSo()
 
    
 
    
 
   File.Save("/tmp/lib.c", "union unione {\n"
 
   File.Save("/tmp/lib.c", "union unione {\n"
Riga 43: Riga 43:
 
      
 
      
 
   Shell "gcc -o /tmp/lib.so /tmp/lib.c -shared -fPIC" Wait
 
   Shell "gcc -o /tmp/lib.so /tmp/lib.c -shared -fPIC" Wait
 
+
  '''End'''
+
  End

Versione attuale delle 18:28, 12 giu 2024

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