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 2: | Riga 2: | ||
Per passare una stringa ad una funzione esterna, bisognerà utilizzare la funzione [[Alloc|Alloc()]]. | Per passare una stringa ad una funzione esterna, bisognerà utilizzare la funzione [[Alloc|Alloc()]]. | ||
− | <BR> | + | <BR>Nel seguente codice Gambas, contenente anche la parte per la creazione del codice C della libreria esterna, si riceverà una stringa per "valore": |
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 37: | Riga 37: | ||
" strcat(s,t);\n\n" & | " strcat(s,t);\n\n" & | ||
" return s;\n}") | " return s;\n}") | ||
+ | |||
+ | Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | In quest'altro caso si otterrà la stringa dal passaggio per "indirizzo" della variabile di tipo "Puntatore" alla libreria esterna: | ||
+ | Private Extern riceve_passa(testo As Pointer) As String In "/tmp/libadhoc" | ||
+ | |||
+ | |||
+ | '''Public''' Sub Main() | ||
+ | |||
+ | Dim po As Pointer | ||
+ | |||
+ | <FONT color=gray>' ''Va a generare la libreria condivisa "libadhoc.so":''</font> | ||
+ | Creaso() | ||
+ | |||
+ | <FONT color=gray>' ''Per passare una stringa ad una funzione esterna, utilizzare 'alloc()':''</font> | ||
+ | po = Alloc("Mu") | ||
+ | |||
+ | riceve_passa(po) | ||
+ | |||
+ | Print "---> "; String@(po) | ||
+ | |||
+ | <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" & | ||
+ | "void riceve_passa(char * s) {\n\n" & | ||
+ | " r = \"si\";\n" & | ||
+ | " strcat(s,r);\n" & | ||
+ | " strcat(s,t);\n\n}") | ||
Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait | Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait | ||
'''End''' | '''End''' |
Versione attuale delle 17:44, 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.
Per passare una stringa ad una funzione esterna, bisognerà utilizzare la funzione Alloc().
Nel seguente codice Gambas, contenente anche la parte per la creazione del codice C della libreria esterna, si riceverà una stringa per "valore":
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
In quest'altro caso si otterrà la stringa dal passaggio per "indirizzo" della variabile di tipo "Puntatore" alla libreria esterna:
Private Extern riceve_passa(testo As Pointer) As String In "/tmp/libadhoc" Public Sub Main() 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") riceve_passa(po) Print "---> "; String@(po) ' 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" & "void riceve_passa(char * s) {\n\n" & " r = \"si\";\n" & " strcat(s,r);\n" & " strcat(s,t);\n\n}") Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait End