Differenze tra le versioni di "Verificare quali dati Gambas passa ad una funzione esterna"
Da Gambas-it.org - Wikipedia.
Riga 1: | Riga 1: | ||
Per sapere quali dati Gambas invia ad una funzione esterna, dovremo servirci di un'apposita libreria esterna in C che ci restituirà i risultati dei dati effettivi passati da Gambas. In tal modo sarà possibile verificare se Gambas invia ad una funzione esterna qualsiasi i dati corretti. | Per sapere quali dati Gambas invia ad una funzione esterna, dovremo servirci di un'apposita libreria esterna in C che ci restituirà i risultati dei dati effettivi passati da Gambas. In tal modo sarà possibile verificare se Gambas invia ad una funzione esterna qualsiasi i dati corretti. | ||
− | Nell'esempio, che utilizzeremo in questa pagina, abbiamo un applicativo Gambas che riempie una ''Struttura'' ed una variabile vettoriale con alcuni dati. <BR>L'applicativo, poi, passerà ad una funzione della predetta libreria esterna, da noi realizzata, per la verifica dei dati effettivamente passati. | + | Nell'esempio, che utilizzeremo in questa pagina, abbiamo un applicativo Gambas che riempie una ''Struttura'' ed una variabile vettoriale con alcuni dati. |
− | + | <BR>L'applicativo, poi, passerà l'indirizzo di memoria della predetta ''Struttura'' ad una funzione della predetta libreria esterna, da noi realizzata, per la verifica dei dati effettivamente passati. | |
+ | |||
+ | ====Passare l'indirizzo di memoria della Struttura, ottenuto con la funzione "VarPtr()"==== | ||
Public Struct prova | Public Struct prova | ||
a As Byte | a As Byte | ||
Riga 15: | Riga 17: | ||
− | + | Public Sub Main() | |
<FONT color=gray>' ''Va a generare l'apposita libreria esterna .so per la verifica:''</font> | <FONT color=gray>' ''Va a generare l'apposita libreria esterna .so per la verifica:''</font> | ||
Creaso() | Creaso() | ||
− | <FONT color=gray>' '' | + | <FONT color=gray>' ''Assegna dei valori ai campi della Struttura:''</font> |
With pr | With pr | ||
.a = 44 | .a = 44 | ||
Riga 27: | Riga 29: | ||
End With | End With | ||
− | <FONT color=gray>' '' | + | <FONT color=gray>' ''Assegna due valori anche a due rispettivi elementi del vettore:''</font> |
vett[0] = 5 | vett[0] = 5 | ||
vett[4] = 10 | vett[4] = 10 | ||
− | <FONT color=gray>' ''Vengono mostrati in console i risultati | + | <FONT color=gray>' '''Vengono mostrati in console i risultati'''</font> |
− | verifica(VarPtr(pr)) | + | verifica(VarPtr(pr)) <SUP>[[[#Note|nota 1]]]</sup> |
− | |||
verifica(VarPtr(vett)) | verifica(VarPtr(vett)) | ||
<FONT color=gray>' ''oppure:'' '''verifica(vett.Data)'''</font> | <FONT color=gray>' ''oppure:'' '''verifica(vett.Data)'''</font> | ||
− | + | End | |
− | ''' | + | |
+ | Private Procedure Creaso() | ||
+ | |||
+ | File.Save("/tmp/libverifica.c", "#include <stdio.h>\n\n" & | ||
+ | "void verifica(unsigned char *p) {\n" & | ||
+ | " int i;\n" & | ||
+ | " printf(\"Valore puntatore: %x;\\n dump:\", (int) *p);\n" & | ||
+ | " for (i=0; i<8; i++)\n" & | ||
+ | " printf(\" %2.2x \", *p++);\n" & | ||
+ | " printf(\"\\n\\n\");\n}") | ||
+ | |||
+ | Shell "gcc -fPIC -o /tmp/libverifica.so /tmp/libverifica.c -shared" Wait | ||
+ | |||
+ | End | ||
+ | |||
+ | ====Passare l'indirizzo di memoria della Struttura, ottenuto con il Metodo "Object.Address()"==== | ||
+ | Public Struct prova | ||
+ | a As Byte | ||
+ | b As Short | ||
+ | c As Integer | ||
+ | End Struct | ||
+ | |||
+ | Private Extern verifica(p As Pointer) In "/tmp/libverifica" | ||
+ | |||
+ | |||
+ | Public Sub Main() | ||
+ | |||
+ | Dim pr As New Prova | ||
+ | Dim vett As New Byte[10] | ||
+ | |||
+ | <FONT color=gray>' ''Va a generare l'apposita libreria esterna .so per la verifica:''</font> | ||
+ | Creaso() | ||
+ | |||
+ | <FONT color=gray>' ''Assegna dei valori ai campi della Struttura:''</font> | ||
+ | With pr | ||
+ | .a = 44 | ||
+ | .b = 444 | ||
+ | .c = 44444 | ||
+ | End With | ||
+ | |||
+ | <FONT color=gray>' ''Assegna due valori anche a due rispettivi elementi del vettore:''</font> | ||
+ | vett[0] = 5 | ||
+ | vett[4] = 10 | ||
+ | |||
+ | |||
+ | <FONT color=gray>' '''Vengono mostrati in console i risultati'''</font> | ||
+ | verifica(Object.Address(pr) + 24) <SUP>[[[#Note|nota 1]]]</sup> | ||
+ | |||
+ | verifica(vett.Data) | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Private Procedure Creaso() | ||
File.Save("/tmp/libverifica.c", "#include <stdio.h>\n\n" & | File.Save("/tmp/libverifica.c", "#include <stdio.h>\n\n" & | ||
Riga 53: | Riga 107: | ||
Shell "gcc -fPIC -o /tmp/libverifica.so /tmp/libverifica.c -shared" Wait | Shell "gcc -fPIC -o /tmp/libverifica.so /tmp/libverifica.c -shared" Wait | ||
− | + | End | |
+ | |||
+ | |||
+ | |||
+ | =Note= | ||
+ | [1] Vedere la seguente pagina: [[Ottenere il puntatore di una variabile di tipo Struttura]] |
Versione attuale delle 18:01, 7 giu 2024
Per sapere quali dati Gambas invia ad una funzione esterna, dovremo servirci di un'apposita libreria esterna in C che ci restituirà i risultati dei dati effettivi passati da Gambas. In tal modo sarà possibile verificare se Gambas invia ad una funzione esterna qualsiasi i dati corretti.
Nell'esempio, che utilizzeremo in questa pagina, abbiamo un applicativo Gambas che riempie una Struttura ed una variabile vettoriale con alcuni dati.
L'applicativo, poi, passerà l'indirizzo di memoria della predetta Struttura ad una funzione della predetta libreria esterna, da noi realizzata, per la verifica dei dati effettivamente passati.
Passare l'indirizzo di memoria della Struttura, ottenuto con la funzione "VarPtr()"
Public Struct prova a As Byte b As Short c As Integer End Struct Private pr As Struct Prova Private vett[10] As Byte Private Extern verifica(p As Pointer) In "/tmp/libverifica" Public Sub Main() ' Va a generare l'apposita libreria esterna .so per la verifica: Creaso() ' Assegna dei valori ai campi della Struttura: With pr .a = 44 .b = 444 .c = 44444 End With ' Assegna due valori anche a due rispettivi elementi del vettore: vett[0] = 5 vett[4] = 10 ' Vengono mostrati in console i risultati verifica(VarPtr(pr)) [nota 1] verifica(VarPtr(vett)) ' oppure: verifica(vett.Data) End Private Procedure Creaso() File.Save("/tmp/libverifica.c", "#include <stdio.h>\n\n" & "void verifica(unsigned char *p) {\n" & " int i;\n" & " printf(\"Valore puntatore: %x;\\n dump:\", (int) *p);\n" & " for (i=0; i<8; i++)\n" & " printf(\" %2.2x \", *p++);\n" & " printf(\"\\n\\n\");\n}") Shell "gcc -fPIC -o /tmp/libverifica.so /tmp/libverifica.c -shared" Wait End
Passare l'indirizzo di memoria della Struttura, ottenuto con il Metodo "Object.Address()"
Public Struct prova a As Byte b As Short c As Integer End Struct Private Extern verifica(p As Pointer) In "/tmp/libverifica" Public Sub Main() Dim pr As New Prova Dim vett As New Byte[10] ' Va a generare l'apposita libreria esterna .so per la verifica: Creaso() ' Assegna dei valori ai campi della Struttura: With pr .a = 44 .b = 444 .c = 44444 End With ' Assegna due valori anche a due rispettivi elementi del vettore: vett[0] = 5 vett[4] = 10 ' Vengono mostrati in console i risultati verifica(Object.Address(pr) + 24) [nota 1] verifica(vett.Data) End Private Procedure Creaso() File.Save("/tmp/libverifica.c", "#include <stdio.h>\n\n" & "void verifica(unsigned char *p) {\n" & " int i;\n" & " printf(\"Valore puntatore: %x;\\n dump:\", (int) *p);\n" & " for (i=0; i<8; i++)\n" & " printf(\" %2.2x \", *p++);\n" & " printf(\"\\n\\n\");\n}") Shell "gcc -fPIC -o /tmp/libverifica.so /tmp/libverifica.c -shared" Wait End
Note
[1] Vedere la seguente pagina: Ottenere il puntatore di una variabile di tipo Struttura