Differenze tra le versioni di "Verificare quali dati Gambas passa ad una funzione esterna"
Da Gambas-it.org - Wikipedia.
(2 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 14: | Riga 14: | ||
Private Extern verifica(p As Pointer) In "/tmp/libverifica" | Private Extern verifica(p As Pointer) In "/tmp/libverifica" | ||
− | |||
'''Public''' Sub Main() | '''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> | ||
Riga 37: | Riga 34: | ||
<FONT color=gray>' ''Vengono mostrati in console i risultati:''</font> | <FONT color=gray>' ''Vengono mostrati in console i risultati:''</font> | ||
verifica(VarPtr(pr)) | verifica(VarPtr(pr)) | ||
− | + | <FONT color=gray>' ''oppure:'' '''verifica(Object.Address(pr))'''</font> | |
− | + | ||
− | + | verifica(VarPtr(vett)) | |
− | verifica( | + | <FONT color=gray>' ''oppure:'' '''verifica(vett.Data)'''</font> |
− | |||
− | |||
'''End''' | '''End''' | ||
Riga 51: | Riga 46: | ||
"void verifica(unsigned char *p) {\n" & | "void verifica(unsigned char *p) {\n" & | ||
" int i;\n" & | " int i;\n" & | ||
− | " printf(\"Valore puntatore: %x;\n dump:\", (int) *p);\n" & | + | " printf(\"Valore puntatore: %x;\\n dump:\", (int) *p);\n" & |
" for (i=0; i<8; i++)\n" & | " for (i=0; i<8; i++)\n" & | ||
" printf(\" %2.2x \", *p++);\n" & | " printf(\" %2.2x \", *p++);\n" & | ||
− | " printf("\n\n");\n}") | + | " printf(\"\\n\\n\");\n}") |
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''' | '''End''' |
Versione attuale delle 05:48, 8 dic 2021
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à ad una funzione della predetta libreria esterna, da noi realizzata, per la verifica dei dati effettivamente passati.
Il codice dell'applicativo Gambas sarà il seguente:
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() ' Assegniamo dei valori ai campi della Struttura: With pr .a = 44 .b = 444 .c = 44444 End With ' Assegniamo due valori a due rispettivi elementi del vettore: vett[0] = 5 vett[4] = 10 ' Vengono mostrati in console i risultati: verifica(VarPtr(pr)) ' oppure: verifica(Object.Address(pr)) 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