Differenze tra le versioni di "Scrivere una libreria esterna alla quale viene passata una struttura"
(Creata pagina con "Qualora si debba scrivere una propria libreria dinamica condivisa (.so) esterna, bisognerà tenere conto di quanto appresso descritto. Nel codice sorgente C della libreria es...") |
|||
Riga 1: | Riga 1: | ||
− | Qualora si debba scrivere una propria libreria dinamica condivisa (.so) esterna, bisognerà tenere conto | + | Qualora si debba scrivere una propria libreria dinamica condivisa (.so) esterna, bisognerà tenere conto nel codice sorgente, scritto in C, della libreria esterna di quanto segue: |
− | + | <BR>- si dovrà riprodurre una ''Struttura'' omogenea - in ordine alla tipologia dei suoi membri - alla ''Struttura'' di Gambas passata; | |
− | |||
− | <BR>- | ||
<BR>- il parametro della funzione della libreria esterna, che riceve la ''Struttura'' di Gambas passata, deve essere dichiarato come ''Puntatore'' alla ''Struttura'' definita nel codice sorgente C della libreria medesima. | <BR>- il parametro della funzione della libreria esterna, che riceve la ''Struttura'' di Gambas passata, deve essere dichiarato come ''Puntatore'' alla ''Struttura'' definita nel codice sorgente C della libreria medesima. | ||
Versione delle 08:32, 19 ago 2015
Qualora si debba scrivere una propria libreria dinamica condivisa (.so) esterna, bisognerà tenere conto nel codice sorgente, scritto in C, della libreria esterna di quanto segue:
- si dovrà riprodurre una Struttura omogenea - in ordine alla tipologia dei suoi membri - alla Struttura di Gambas passata;
- il parametro della funzione della libreria esterna, che riceve la Struttura di Gambas passata, deve essere dichiarato come Puntatore alla Struttura definita nel codice sorgente C della libreria medesima.
Mostriamo un semplice esempio, nel quale verrà creato in linguaggio C il codice sorgente della nostra libreria dinamica condivisa esterna come di seguito:
struct STRUTTURA_C { double x; double y; double z; }; double FunzioneEsterna(struct STRUTTURA_C * sC) { double d; d = sC->x + sC->y + sC->z; return d; }
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() Dim s As String s = "struct STRUTTURA_C {" & "\n double x;" & "\n double y;" & "\n double z;\n};" & "\n\n" & "\ndouble FunzioneEsterna(struct STRUTTURA_C *sC) {" & "\n\n double d;" & "\n\n d = sC->x + sC->y + sC->z;" & "\n\n return d;\n}" File.Save("/tmp/lib_esterna.c", s) Shell "gcc -o /tmp/lib_esterna.so /tmp/lib_esterna.c -shared" Wait End