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:
 
#include <string.h>
 
 
 
    char *r;
 
    char t[2] = "ca";
 
 
 
    char * riceve_passa(char * s) {
 
 
    r = "si";
 
 
    strcat(s,r);
 
    strcat(s,t);
 
 
 
    return s;
 
 
}
 
 
 
 
 
Codice Gambas:
 
 
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>' ''Genera la libreria condivisa "libadhoc.so":''</font>
+
  Creaso()
  Shell "gcc -o /tmp/libadhoc.so " & Application.Path &/ "libadhoc.c -shared -fPIC" Wait
 
 
 
   
 
   
 
  <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")
+
  po = Alloc("Mu")
 
    
 
    
  s = riceve_passa(po)
+
  s = riceve_passa(po)
 
      
 
      
  Print "---> "; s
+
  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}")
 
   
 
   
  Free(po)
+
  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