Differenze tra le versioni di "Scrivere una libreria esterna che ritorna una Struttura"
Da Gambas-it.org - Wikipedia.
Riga 35: | Riga 35: | ||
Dim nst As New Nome_Struttura | Dim nst As New Nome_Struttura | ||
+ | |||
+ | Shell "gcc -o /tmp/libprovaC.so " & Application.Path & "/libprovaC.c -shared -fPIC" Wait | ||
nst = prova() | nst = prova() | ||
Print nst.a, String@(nst.b) | Print nst.a, String@(nst.b) | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | |||
+ | ===Caso in cui la funzione esterna ritorna una ''Struttura'' avente tra i suoi membri uno o più ''vettori'' di tipo "''char''"=== | ||
+ | Codice della libreria esterna in C: | ||
+ | struct nome_struttura { | ||
+ | char b[4]; | ||
+ | int a; | ||
+ | }; | ||
+ | |||
+ | struct nome_struttura variabile_struttura; | ||
+ | |||
+ | |||
+ | struct nome_struttura *prova() { | ||
+ | |||
+ | variabile_struttura.b[0] = 'p'; <FONT color=blue>//assegna un carattere per ciascun elemento del vettore di tipo "chr"</font> | ||
+ | variabile_struttura.b[1] = 'e'; | ||
+ | variabile_struttura.b[2] = 'r'; | ||
+ | variabile_struttura.b[3] = 'a'; | ||
+ | |||
+ | variabile_struttura.a = 99; | ||
+ | |||
+ | return &variabile_struttura; <FONT color=blue>// ritorna l'indirizzo di "variabile_struttura"</font> | ||
+ | |||
+ | }; | ||
+ | |||
+ | |||
+ | Codice Gambas | ||
+ | |||
+ | Se un membro della ''Struttura'', presente nella libreria esterna in C, è dichiarato come un vettore di tipo "''char''", allora il corrispondente membro della rispettiva ''Struttura'' in Gambas potrà essere dichiarato come vettore di tipo ''Byte[]''. I valori ASCII di tale vettore di tipo ''Byte[]'' potranno essere recuperati, ai fini della ricomposizione dell'intera stringa di caratteri, con il metodo ''.ToString()''. | ||
+ | |||
+ | Public Struct Nome_Struttura | ||
+ | b[4] As Byte | ||
+ | a As Integer | ||
+ | End Struct | ||
+ | |||
+ | |||
+ | Library "/tmp/libprovaC" | ||
+ | Private Extern prova() 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 | ||
+ | |||
+ | nst = prova() | ||
+ | |||
+ | Print nst.b.ToString() | ||
+ | Print nst.a | ||
'''End''' | '''End''' |
Versione delle 03:52, 11 mar 2014
Di seguito è mostrato un esempio, nel quale la funzione esterna della libreria in C ritorna una Struttura.
Codice della libreria esterna in C:
struct nome_struttura { int a; char *b; }; struct nome_struttura variabile_struttura;</font> struct nome_struttura *prova() { variabile_struttura.a = 99; // Assegna i valori ai membri della Struttura variabile_struttura.b = "prova"; return &variabile_struttura; }
Codice Gambas:
Public Struct Nome_Struttura a As Integer b As Pointer End Struct Library "/tmp/libprovaC" Private Extern prova() 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 nst = prova() Print nst.a, String@(nst.b) End
Caso in cui la funzione esterna ritorna una Struttura avente tra i suoi membri uno o più vettori di tipo "char"
Codice della libreria esterna in C:
struct nome_struttura { char b[4]; int a; }; struct nome_struttura variabile_struttura; struct nome_struttura *prova() { 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'; variabile_struttura.a = 99; return &variabile_struttura; // ritorna l'indirizzo di "variabile_struttura" };
Codice Gambas
Se un membro della Struttura, presente nella libreria esterna in C, è dichiarato come un vettore di tipo "char", allora il corrispondente membro della rispettiva Struttura in Gambas potrà essere dichiarato come vettore di tipo Byte[]. I valori ASCII di tale vettore di tipo Byte[] potranno essere recuperati, ai fini della ricomposizione dell'intera stringa di caratteri, con il metodo .ToString().
Public Struct Nome_Struttura b[4] As Byte a As Integer End Struct Library "/tmp/libprovaC" Private Extern prova() 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 nst = prova() Print nst.b.ToString() Print nst.a End