Differenze tra le versioni di "Scrivere una libreria esterna che chiama una funzione esterna puntata"

Da Gambas-it.org - Wikipedia.
 
(7 versioni intermedie di uno stesso utente non sono mostrate)
Riga 8: Riga 8:
 
   
 
   
 
  }
 
  }
 
+
L'applicativo Gambas sarà invece il seguente:
 
+
  Private Extern Chiamata_Funzione(vI As Integer) As Integer In "/tmp/libadhoc"
La libreria esterna, da noi scritta e che chiameremo ''libadhoc.c'', sarà la seguente:
 
  #include <stdio.h>
 
#include "''/percorso/del/file/sorgente_C.c''"
 
 
   
 
   
 
   
 
   
  <FONT color=#B22222>int (*po)(int)</font>;
+
  '''Public''' Sub Main()
 
   
 
   
 +
  Dim i As Integer = 999
 
   
 
   
  int Chiamata_Funzione(int i) {
+
  <FONT color=gray>' ''Va a generare la libreria esterna condivisa da noi scritta:''</font>
 
+
  Creaso()
  po = Funzione_Puntata;  <FONT color=gray>//inizializzazione del Puntatore a funzione</font>
 
 
   
 
   
  return <FONT color=#B22222>(*po)(i)</font>;
+
  i = Chiamata_Funzione(i)
 
   
 
   
}
+
  Print "Valore ritornato dalla funzione-puntatore: "; i
Il codice sorgente della libreria esterna, da noi scritta, verrà posto nella cartella ''Dati'' del progetto Gambas.
 
 
 
 
 
L'applicativo Gambas sarà invece il seguente:
 
Private Extern Chiamata_Funzione(vI As Integer) As Integer In "/tmp/libadhoc"
 
 
 
'''Public''' Sub Form_Open()
 
 
<FONT color=gray>' ''Genera la libreria esterna condivisa da noi scritta:''</font>
 
  Shell "gcc -o /tmp/libadhoc.so " & Application.Path &/ "libadhoc.c -shared  -fPIC" Wait
 
 
   
 
   
 
  '''End'''
 
  '''End'''
 
   
 
   
 +
'''Private''' Procedure Creaso()
 
   
 
   
'''Public''' Sub Button1_Click()
+
  File.Save("/tmp/libadhoc.c", "#include \"<FONT color=gray>''/percorso/del/file/sorgente_C.c''</font>\"\n\n" &
    
+
                              "<FONT color=#B22222>int (*po)(int)</font>;\n\n" &
   Dim i As Integer = 999
+
                              "int Chiamata_Funzione(int i) {\n\n" &
+
                              "   po = Funzione_Puntata;   <FONT color=gray>//inizializzazione del Puntatore a funzione</font>\n\n" &
  i = Chiamata_Funzione(i)
+
                              "  return <FONT color=#B22222>(*po)(i)</font>;\n}")
 
   
 
   
  Print "Valore ritornato dalla funzione-puntatore: "; i
+
  Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared  -fPIC" Wait
 
   
 
   
 
  '''End'''
 
  '''End'''
  
 
+
====Uso della sola libreria esterna condivisa .so====
===Uso della sola libreria esterna condivisa .so===
 
 
Il codice presente nel file ''sorgente_C.c'' dell'esempio precedente può anche essere più semplicemente contenuto nella sola libreria esterna condivisa .so, come segue:
 
Il codice presente nel file ''sorgente_C.c'' dell'esempio precedente può anche essere più semplicemente contenuto nella sola libreria esterna condivisa .so, come segue:
  #include <stdio.h>
+
  Private Extern Chiamata_Funzione(vI As Integer) As Integer In "/tmp/libadhoc"
 
   
 
   
 
   
 
   
  <FONT color=#B22222>int (*po)(int)</font>;
+
  '''Public''' Sub Main()
 
   
 
   
 +
  Dim i As Integer = 999
 
   
 
   
  int Funzione_Puntata(int valore) {
+
  <FONT color=gray>' ''Va a generare la libreria esterna condivisa da noi scritta:''</font>
 +
  Creaso()
 +
 
 +
  i = Chiamata_Funzione(i)
 +
 +
  Print "Valore ritornato dalla funzione-puntatore: "; i
 
   
 
   
  return valore + 1;
+
'''End'''
 
   
 
   
  }
+
  '''Private''' Procedure Creaso()
 
   
 
   
 +
  File.Save("/tmp/libadhoc.c", "<FONT color=#B22222>int (*po)(int)</font>;\n\n" &
 +
                              "int Funzione_Puntata(int valore) {\n\n" &
 +
                              "  return valore + 1;\n}\n\n" &
 +
                              "int Chiamata_Funzione(int i) {\n" &
 +
                              "  po = Funzione_Puntata;  <FONT color=gray>//inizializzazione del Puntatore a funzione</font>\n\n" &
 +
                              "  return <FONT color=#B22222>(*po)(i)</font>;\n}")
 
   
 
   
int Chiamata_Funzione(int i) {
+
   Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared  -fPIC" Wait
 
 
  po = Funzione_Puntata;   <FONT color=gray>//inizializzazione del Puntatore a funzione</font>
 
 
 
  return <FONT color=#B22222>(*po)(i)</font>;
 
 
   
 
   
  }
+
  '''End'''
 
 
  
  
  
 
==Uso del metodo ''System.GetExternSymbol()''==
 
==Uso del metodo ''System.GetExternSymbol()''==
E' possibile utilizzare anche il metodo ''.GetExternSymbol()'' della Classe ''System'', come segue (poniamo tutto il codice C nella sola libreria esterna condivisa, che chiameremo ''libadhoc.so''):
+
E' possibile utilizzare anche il metodo ''.GetExternSymbol()'' della Classe ''System'', come segue (poniamo tutto il codice C nella sola libreria esterna condivisa, che chiameremo ''libadhoc.so'' e che provvederemo a creare all'interno del codice stesso di Gambas):
#include <stdio.h>
 
 
 
int <FONT color=blue>Funzione_Puntata</font>(int valore) {
 
 
  return valore + 1;
 
 
}
 
 
 
int Chiamata_Funzione(<FONT color=#B22222>int (*p)(int)</font>, int i) {
 
 
    return <FONT color=#B22222>(*p)(i)</font>);
 
 
}
 
Il codice sorgente della libreria esterna, da noi scritta, verrà posto nella cartella ''Dati'' del progetto Gambas.
 
 
 
 
 
L'applicativo Gambas sarà invece il seguente:
 
 
  Private Extern Chiamata_Funzione(po As Pointer, i As Integer) As Integer In "/tmp/libadhoc"
 
  Private Extern Chiamata_Funzione(po As Pointer, i As Integer) As Integer In "/tmp/libadhoc"
 
   
 
   
Riga 106: Riga 80:
 
   Dim i As Integer
 
   Dim i As Integer
 
    
 
    
<FONT color=gray>' ''Genera la libreria esterna condivisa da noi scritta:''</font>
+
  Creaso()
  Shell "gcc -o /tmp/libadhoc.so " & Application.Path &/ "libadhoc.c -shared -fPIC" Wait
+
 
 +
  p = <FONT color=#B22222>System.GetExternSymbol</font>("/tmp/libadhoc", "<FONT color=blue>Funzione_Puntata</font>")
 +
   
 +
  i = Chiamata_Funzione(p, 99)
 +
 
 +
  Print i
 
   
 
   
  p = System.GetExternSymbol("/tmp/libadhoc", "<FONT color=blue>Funzione_Puntata</font>")
+
'''End'''
 
   
 
   
  i = Chiamata_Funzione(p, 99)
+
'''Private''' Procedure Creaso()
 +
 
 +
<FONT color=gray>' ''Salva il codice, scritto in C, della nostra libreria esterna condivisa:''</font>
 +
  File.Save("/tmp/libadhoc.c", "int <FONT color=blue>Funzione_Puntata</font>(int valore) {\n" &
 +
            "  return valore + 1;\n}\n\n" &
 +
            "int Chiamata_Funzione(<FONT color=#B22222>int (*p)(int)</font>, int i) {\n" &
 +
            "  return <FONT color=#B22222>(*p)(i)</font>;\n}")
 +
 
 +
<FONT color=gray>' ''Genera la libreria esterna condivisa da noi scritta:''</font>
 +
  Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait
 
    
 
    
  Print i
 
 
 
  '''End'''
 
  '''End'''
 
  
  
Riga 122: Riga 107:
 
E' possibile utilizzare una semplice variabile di tipo ''Puntatore'' al posto del metodo ''.GetExternSymbol()'' appena sopra prima visto. A detta variabile di tipo ''Puntatore'' sarà assegnata la funzione, presente nella libreria esterna condivisa, da puntare.
 
E' possibile utilizzare una semplice variabile di tipo ''Puntatore'' al posto del metodo ''.GetExternSymbol()'' appena sopra prima visto. A detta variabile di tipo ''Puntatore'' sarà assegnata la funzione, presente nella libreria esterna condivisa, da puntare.
  
Anche questa volta dobbiamo porre tutto il codice C nella sola libreria esterna condivisa, che chiameremo ''libadhoc.so'':
+
Anche questa volta dobbiamo porre tutto il codice C nella sola libreria esterna condivisa, che chiameremo ''libadhoc.so'' e che provvederemo a creare all'interno del codice stesso di Gambas:
#include <stdio.h>
 
 
 
int <FONT color=blue>Funzione_Puntata</font>(int valore) {
 
 
  return valore + 1;
 
 
}
 
 
 
int Chiamata_Funzione(<FONT color=#B22222>int (*p)(int)</font>, int i) {
 
 
    return <FONT color=#B22222>(*p)(i)</font>);
 
 
}
 
Il codice sorgente della libreria esterna, da noi scritta, verrà posto nella cartella ''Dati'' del progetto Gambas.
 
 
 
 
 
L'applicativo Gambas sarà invece il seguente:
 
 
  Library "/tmp/libadhoc"  
 
  Library "/tmp/libadhoc"  
 
   
 
   
Riga 153: Riga 119:
 
   Dim i As Integer
 
   Dim i As Integer
 
    
 
    
<FONT color=gray>' ''Genera la libreria esterna condivisa da noi scritta:''</font>
+
  Creaso()
  Shell "gcc -o /tmp/libadhoc.so " & Application.Path &/ "libadhoc.c -shared  -fPIC" Wait
 
 
   
 
   
  p = <FONT color=blue>Funzione_Puntata</font>
+
  p = <FONT color=blue>Funzione_Puntata</font>
 
   
 
   
  i = Chiamata_Funzione(p, 99)
+
  i = Chiamata_Funzione(p, 99)
 
    
 
    
  Print i
+
  Print i
 +
 +
'''End'''
 
   
 
   
 +
'''Private''' Procedure Creaso()
 +
 
 +
<FONT color=gray>' ''Salva il codice, scritto in C, della nostra libreria esterna condivisa:''</font>
 +
  File.Save("/tmp/libadhoc.c", "int <FONT color=blue>Funzione_Puntata</font>(int valore) {\n" &
 +
            "  return valore + 1;\n}\n\n" &
 +
            "int Chiamata_Funzione(<FONT color=#B22222>int (*p)(int)</font>, int i) {\n" &
 +
            "  return <FONT color=#B22222>(*p)(i)</font>;\n}")
 +
 
 +
<FONT color=gray>' ''Genera la libreria esterna condivisa da noi scritta:''</font>
 +
  Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait
 +
 
 
  '''End'''
 
  '''End'''

Versione attuale delle 18:40, 18 ago 2022

Una libreria esterna appositamente può essere scritta per utilizzare una funzione esterna puntata da un Puntatore.


Nel seguente esempio abbiamo un codice sorgente in linguaggio C, che chiameremo "sorgente_C.c", nel quale è presente la funzione che vogliamo utilizzare e che è puntata da un Puntatore a Funzione:

int Funzione_Puntata(int valore) {

  return valore + 1;

}

L'applicativo Gambas sarà invece il seguente:

Private Extern Chiamata_Funzione(vI As Integer) As Integer In "/tmp/libadhoc"


Public Sub Main()

 Dim i As Integer = 999

' Va a generare la libreria esterna condivisa da noi scritta:
 Creaso()

 i = Chiamata_Funzione(i)

 Print "Valore ritornato dalla funzione-puntatore: "; i

End

Private Procedure Creaso()

 File.Save("/tmp/libadhoc.c", "#include \"/percorso/del/file/sorgente_C.c\"\n\n" &
                              "int (*po)(int);\n\n" &
                              "int Chiamata_Funzione(int i) {\n\n" &
                              "   po = Funzione_Puntata;   //inizializzazione del Puntatore a funzione\n\n" &
                              "   return (*po)(i);\n}")

 Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared  -fPIC" Wait

End

Uso della sola libreria esterna condivisa .so

Il codice presente nel file sorgente_C.c dell'esempio precedente può anche essere più semplicemente contenuto nella sola libreria esterna condivisa .so, come segue:

Private Extern Chiamata_Funzione(vI As Integer) As Integer In "/tmp/libadhoc"


Public Sub Main()

 Dim i As Integer = 999

' Va a generare la libreria esterna condivisa da noi scritta:
 Creaso()
 
 i = Chiamata_Funzione(i)

 Print "Valore ritornato dalla funzione-puntatore: "; i

End

Private Procedure Creaso()

 File.Save("/tmp/libadhoc.c", "int (*po)(int);\n\n" &
                              "int Funzione_Puntata(int valore) {\n\n" &
                              "   return valore + 1;\n}\n\n" &
                              "int Chiamata_Funzione(int i) {\n" &
                              "   po = Funzione_Puntata;   //inizializzazione del Puntatore a funzione\n\n" &
                              "   return (*po)(i);\n}")

 Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared  -fPIC" Wait

End


Uso del metodo System.GetExternSymbol()

E' possibile utilizzare anche il metodo .GetExternSymbol() della Classe System, come segue (poniamo tutto il codice C nella sola libreria esterna condivisa, che chiameremo libadhoc.so e che provvederemo a creare all'interno del codice stesso di Gambas):

Private Extern Chiamata_Funzione(po As Pointer, i As Integer) As Integer In "/tmp/libadhoc"


Public Sub Main()

 Dim p As Pointer
 Dim i As Integer
 
 Creaso()
 
 p = System.GetExternSymbol("/tmp/libadhoc", "Funzione_Puntata")

 i = Chiamata_Funzione(p, 99)
 
 Print i

End

Private Procedure Creaso()
 
' Salva il codice, scritto in C, della nostra libreria esterna condivisa:
 File.Save("/tmp/libadhoc.c", "int Funzione_Puntata(int valore) {\n" &
           "   return valore + 1;\n}\n\n" &
           "int Chiamata_Funzione(int (*p)(int), int i) {\n" &
           "   return (*p)(i);\n}")
 
' Genera la libreria esterna condivisa da noi scritta:
 Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait
 
End


Uso di una semplice variabile di tipo Puntatore

E' possibile utilizzare una semplice variabile di tipo Puntatore al posto del metodo .GetExternSymbol() appena sopra prima visto. A detta variabile di tipo Puntatore sarà assegnata la funzione, presente nella libreria esterna condivisa, da puntare.

Anche questa volta dobbiamo porre tutto il codice C nella sola libreria esterna condivisa, che chiameremo libadhoc.so e che provvederemo a creare all'interno del codice stesso di Gambas:

Library "/tmp/libadhoc" 

Private Extern Chiamata_Funzione(po As Pointer, i As Integer) As Integer
Private Extern Funzione_Puntata()


Public Sub Main()

 Dim p As Pointer
 Dim i As Integer
 
 Creaso()

 p = Funzione_Puntata

 i = Chiamata_Funzione(p, 99)
 
 Print i

End

Private Procedure Creaso()
 
' Salva il codice, scritto in C, della nostra libreria esterna condivisa:
 File.Save("/tmp/libadhoc.c", "int Funzione_Puntata(int valore) {\n" &
           "   return valore + 1;\n}\n\n" &
           "int Chiamata_Funzione(int (*p)(int), int i) {\n" &
           "   return (*p)(i);\n}")
 
' Genera la libreria esterna condivisa da noi scritta:
 Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait
 
End