Differenze tra le versioni di "Scrivere una libreria esterna alla quale viene passato un Puntatore e che ritorna un Puntatore"

Da Gambas-it.org - Wikipedia.
Riga 8: Riga 8:
 
   Dim b As Byte
 
   Dim b As Byte
 
   
 
   
  b = 100
+
  b = 100
 
   
 
   
  p = VarPtr(b)
+
  p = VarPtr(b)
 
    
 
    
 
  <FONT Color=gray>' ''Viene scritta e creata la libreria esterna contenente una funzione:''</font>
 
  <FONT Color=gray>' ''Viene scritta e creata la libreria esterna contenente una funzione:''</font>
  File.Save("/tmp/c.c", "char  c;" &
+
  File.Save("/tmp/c.c", "char  c;" &
            "\n\n<FONT Color=#B22222>char *</font> Addiziona(<FONT Color=#B22222>char * p</font>) {" &
+
            "\n\n<FONT Color=#B22222>char *</font> Addiziona(<FONT Color=#B22222>char * p</font>) {" &
            "\n\n  c = 99 + *p;" &
+
            "\n\n  c = 99 + *p;" &
            "\n\n  p = &c;" &
+
            "\n\n  p = &c;" &
            "\n\n  return <FONT Color=#B22222>p</font>;\n\n}")
+
            "\n\n  return <FONT Color=#B22222>p</font>;\n\n}")
 
    
 
    
  Shell "gcc -o /tmp/LibAdd.so /tmp/LibAdd.c -shared -fPIC" Wait
+
  Shell "gcc -o /tmp/LibAdd.so /tmp/LibAdd.c -shared -fPIC" Wait
 
    
 
    
  po = Annulla(p)
+
  po = Annulla(p)
  If IsNull(po) Then Error.Raise("Ritornato Puntatore 'Nullo' !!!")
+
  If po == 0 Then Error.Raise("Ritornato Puntatore 'Nullo' !!!")
 
   
 
   
  Print Byte@(po)
+
  Print Byte@(po)
 
    
 
    
 
  '''End'''
 
  '''End'''

Versione delle 17:15, 6 dic 2021

Il caso presente è quello in cui viene scritta una libreria esterna alla quale viene passato un Puntatore. Il valore, ottenuto dall'opportuna dereferenziazione, viene utilizzato in un'operazione nella funzione invocata della libreria, ed il cui risultato verrà trasferito all'applicazione Gambas mediante il ritorno di un Puntatore.

Private Extern Addiziona(pt As Pointer) As Pointer In "/tmp/LibAdd"


Public Sub Main()

 Dim p, po As Pointer
 Dim b As Byte

 b = 100

 p = VarPtr(b)
  
' Viene scritta e creata la libreria esterna contenente una funzione:
 File.Save("/tmp/c.c", "char  c;" &
           "\n\nchar * Addiziona(char * p) {" &
           "\n\n   c = 99 + *p;" &
           "\n\n   p = &c;" &
           "\n\n   return p;\n\n}")
  
 Shell "gcc -o /tmp/LibAdd.so /tmp/LibAdd.c -shared -fPIC" Wait
 
 po = Annulla(p)
 If po == 0 Then Error.Raise("Ritornato Puntatore 'Nullo' !!!")

 Print Byte@(po)
  
End