Scrivere una libreria esterna che ritorna un valore attraverso un parametro di una sua funzione
Da Gambas-it.org - Wikipedia.
Versione del 6 giu 2014 alle 09:47 di Vuott (Discussione | contributi)
Di seguito vengono mostrati alcuni esempi, nei quali viene recuperato nel codice Gambas un valore da un parametro della funzione che invoca una funzione esterna presente in una libreria da noi scritta in C. Il codice C passerà il valore per indirizzo.
Caso generale in cui viene recuperato un Intero
Codice della libreria esterna in C:
void prova1 (int *a) { int t = 99; *a = t; } ' Qualora debba essere passato da Gambas un valore alla libreria C attraverso un parametro di una sua funzione, ' e che sarà dunque utilizzato nella funzione medesima, avremo: void prova2 (int *a) { int t = 99; *a = *a + t; }
Codice Gambas:
Library "/tmp/libprovaC" Private Extern prova1(pro As Pointer) Private Extern prova2(pro As Pointer) Public Sub Main() Dim i1, i2 As Integer Shell "gcc -o /tmp/libprovaC.so " & Application.Path & "/libprovaC.c -shared -fPIC" Wait prova1(VarPtr(i1)) i2 = 1 prova2(VarPtr(i2)) Print i1, i2 End
Caso in cui viene recuperato un Vettore di tipo "char"
Codice della libreria esterna in C:
char a[4]; void prova(char *b[4]) { // oppure: void prova(char *b[]) { a[0] = 'p'; // assegna un carattere per ciascun elemento del vettore di tipo "chr" a[1] = 'e'; a[2] = 'r'; a[3] = 'a'; *b = a; }
Codice Gambas:
Library "/tmp/libprovaC" Private Extern prova(po As Pointer) Public Sub Main() Dim p As Pointer Shell "gcc -o /tmp/libprovaC.so " & Application.Path & "/libprovaC.c -shared -fPIC" Wait prova(VarPtr(p)) Print string@(p) End
Caso in cui viene recuperata una Struttura
Codice della libreria esterna in C:
struct nome_struttura { int a; char b[4]; }; struct nome_struttura variabile_struttura; void prova(struct nome_struttura *p) { variabile_struttura.a = 99; // assegna un valore intero alla struttura */ variabile_struttura.b[0] = 'p'; // assegna un carattere per ciascun elemento del vettore di tipo "chr" variabile_struttura.b[1] = 'e'; variabile_struttura.b[2] = 'r'; variabile_struttura.b[3] = 'a'; *p = variabile_struttura; }
Codice Gambas:
Public Struct Nome_Struttura a As Integer b[4] As Byte End Struct Library "/tmp/libprovaC" Private Extern prova(nomenStru as Nome_Struttura) Public Sub Main() Dim nst As New Nome_Struttura Shell "gcc -o /tmp/libprovaC.so " & Application.Path & "/libprovaC.c -shared -fPIC" Wait prova(nst) Print nst.a Print nst.b.ToString() End