Scrivere una libreria esterna alla quale viene passata una struttura
Qualora si debba scrivere una propria libreria condivisa (.so) esterna, alla quale passare da Gambas una Struttura, perché venga gestita e valorizzata, nel codice sorgente della libreria esterna si dovrà tenere conto di quanto segue:
- si riprodurrà una Struttura omogenea a quella che la funzione esterna riceverà dal codice Gambas;
- il parametro della funzione della libreria esterna, che riceve la Struttura passata da Gambas, deve essere dichiarato come Puntatore al tipo della Struttura definita nel codice della libreria medesima.
L'intero codice Gambas, nel quale provvederemo anche a scrivere e creare sia il codice sorgente in C della libreria esterna, sia il file .so della libreria medesima, sarà il seguente:
Public Struct STRUTTURA_Gambas x As Float Y As Float z As Float End Struct ' double FunzioneEsterna(STRUTTURA_C * sC) Public Extern FunzioneEsterna(struG As STRUTTURA_Gambas) As Float In "/tmp/lib_esterna" Public Sub Main() Dim sG As New STRUTTURA_Gambas Dim ris As Float Creaso() With sG .x = 1.111 .Y = 2.222 .z = 3.333 End With ris = FunzioneEsterna(sG) Print ris End Private Procedure Creaso() File.Save("/tmp/lib_esterna.c", "struct STRUTTURA_C {\n" & " double x;\n" & " double y;\n" & " double z;\n};\n\n" & "double FunzioneEsterna(struct STRUTTURA_C *sC) {\n" & " double d;\n\n" & " d = sC->x + sC->y + sC->z;\n\n" & " return d;\n}") Shell "gcc -o /tmp/lib_esterna.so /tmp/lib_esterna.c -shared" Wait End
Scrivere una libreria esterna alla quale viene passata una struttura e che ritorna una Struttura
Nel caso in cui la libreria esterna, da noi scritta in C, prevede il passaggio di una Struttura dal Programma principale Gambas ad una funzione della libreria esterna, con ritorno della medesima Struttura, detto ritorno potrà essere di due tipi:
- ritorno per "Valore" mediante return;
- ritorno per "Indirizzo".
In particolare nel ritorno della Struttura mediante return la Struttura, passata dal programma Gambas, sarà esplicito oggetto del ritorno mediante return alla fine della funzione esterna chiamata.
Mostriamo un esempio pratico, nel quale verranno mostrati entrambi i casi sopra esposti:
Public Struct STRUTTURA_Gambas x As Float Y As Float z As Float End Struct Library "/tmp/libesterna" ' struct STRUTTURA_C * FunzioneEsterna(STRUTTURA_C *p) Public Extern FunzioneEsterna(struG As STRUTTURA_Gambas) As STRUTTURA_Gambas Public Sub Main() Dim stG, rit As STRUTTURA_Gambas creaso() With stG = New STRUTTURA_Gambas .x = 1.111 .Y = 2.222 .z = 3.333 End With rit = FunzioneEsterna(stG) With rit ' Variabile del tipo "Struttura" ritornata per "Valore" Print .x Print .Y Print .z End With With stG ' Variabile del tipo "Struttura" ritornata per "Indirizzo" Print .x Print .Y Print .z End With End Private Procedure creaso() File.Save("/tmp/libesterna.c", "struct STRUTTURA_C {" & "double x\n;" & "double y\n;" & "double z;};" & "\n\n" & "\nstruct STRUTTURA_C * FunzioneEsterna(struct STRUTTURA_C *p) {" & "\n\n" " p->x *= 11.11;\n" & " p->y *= 22.22;\n" & " p->z *= 33.33;\n" & " return p;\n}") Shell "gcc -o /tmp/libesterna.so /tmp/libesterna.c -shared" Wait End