Differenze tra le versioni di "Scrivere una libreria esterna che modifica un byte all'interno dell'area di memoria di una variabile"
Riga 8: | Riga 8: | ||
Library "/tmp/lib" | Library "/tmp/lib" | ||
− | <FONT Color=gray>' '' | + | <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 delle 17: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