Differenze tra le versioni di "Scrivere una libreria esterna alla quale viene passata una stringa e che ritorna una stringa"
Da Gambas-it.org - Wikipedia.
Riga 1: | Riga 1: | ||
Vediamo un esempio in cui il codice Gambas invoca una funzione esterna presente in una libreria, scritta da noi e che chiameremo ad esempio: ''libadhoc.c'', ed alla quale passa una stringa. La funzione esterna a sua volta passerà alla funzione chiamante di Gambas una stringa. | Vediamo un esempio in cui il codice Gambas invoca una funzione esterna presente in una libreria, scritta da noi e che chiameremo ad esempio: ''libadhoc.c'', ed alla quale passa una stringa. La funzione esterna a sua volta passerà alla funzione chiamante di Gambas una stringa. | ||
− | + | Il codice Gambas, contenente anche la parte per la creazione del codice C della libreria esterna, sarà il seguente: | |
− | Il codice C della libreria esterna sarà il seguente | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Per passare una stringa ad una funzione esterna, bisognerà utilizzare la funzione ''alloc()'': | Per passare una stringa ad una funzione esterna, bisognerà utilizzare la funzione ''alloc()'': | ||
Private Extern riceve_passa(testo As Pointer) As String In "/tmp/libadhoc" | Private Extern riceve_passa(testo As Pointer) As String In "/tmp/libadhoc" | ||
Riga 32: | Riga 11: | ||
Dim po As Pointer | Dim po As Pointer | ||
− | + | <FONT color=gray>' ''Va a generare la libreria condivisa "libadhoc.so":''</font> | |
− | <FONT color=gray>' '' | + | Creaso() |
− | |||
− | |||
<FONT color=gray>' ''Per passare una stringa ad una funzione esterna, utilizzare 'alloc()':''</font> | <FONT color=gray>' ''Per passare una stringa ad una funzione esterna, utilizzare 'alloc()':''</font> | ||
− | + | po = Alloc("Mu") | |
− | + | s = riceve_passa(po) | |
− | + | Print "---> "; s | |
+ | |||
+ | <FONT color=gray>' ''Dealloca l'area di memoria precedentemente riservata e si assicura che il Puntatore non punti ad un indirizzo di memoria rilevante'':''</font> | ||
+ | Free(po) | ||
+ | po = 0 | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | '''Private''' Procedure Creaso() | ||
+ | |||
+ | File.Save("/tmp/libadhoc.c", "#include <string.h>\n\n" & | ||
+ | "char *r;\n" & | ||
+ | "char t[2] = \"ca\";\n\n" & | ||
+ | "char * riceve_passa(char * s) {\n\n" & | ||
+ | " r = \"si\";\n" & | ||
+ | " strcat(s,r);\n" & | ||
+ | " strcat(s,t);\n\n" & | ||
+ | " return s;\n}") | ||
− | + | Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait | |
'''End''' | '''End''' |
Versione delle 17:25, 6 dic 2021
Vediamo un esempio in cui il codice Gambas invoca una funzione esterna presente in una libreria, scritta da noi e che chiameremo ad esempio: libadhoc.c, ed alla quale passa una stringa. La funzione esterna a sua volta passerà alla funzione chiamante di Gambas una stringa.
Il codice Gambas, contenente anche la parte per la creazione del codice C della libreria esterna, sarà il seguente: Per passare una stringa ad una funzione esterna, bisognerà utilizzare la funzione alloc():
Private Extern riceve_passa(testo As Pointer) As String In "/tmp/libadhoc" Public Sub Main() Dim s As String Dim po As Pointer ' Va a generare la libreria condivisa "libadhoc.so": Creaso() ' Per passare una stringa ad una funzione esterna, utilizzare 'alloc()': po = Alloc("Mu") s = riceve_passa(po) Print "---> "; s ' Dealloca l'area di memoria precedentemente riservata e si assicura che il Puntatore non punti ad un indirizzo di memoria rilevante: Free(po) po = 0 End Private Procedure Creaso() File.Save("/tmp/libadhoc.c", "#include <string.h>\n\n" & "char *r;\n" & "char t[2] = \"ca\";\n\n" & "char * riceve_passa(char * s) {\n\n" & " r = \"si\";\n" & " strcat(s,r);\n" & " strcat(s,t);\n\n" & " return s;\n}") Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait End