Gambas-it

Gambas dal mondo esterno => Mailing List => Topic aperto da: vuott - 26 Luglio 2019, 09:23:14

Titolo: Librerie .so: Gambas può puntare ad un array ?
Inserito da: vuott - 26 Luglio 2019, 09:23:14
https://lists.gambas-basic.org/pipermail/user/2019-July/067731.html
Titolo: Re:Librerie .so: Gambas può puntare ad un array ?
Inserito da: vuott - 26 Luglio 2019, 10:09:37
La risposta è che essendo una variabile array già un Puntatore, che punta al primo elemento dell'array medesimo, sarà sufficiente passare alla funzione esterna la semplice variabile array del tipo richiesto.

Semplice esempio:
Codice: [Seleziona]
Library "/tmp/prova"

Private Extern vettore(bib As Byte[])


Public Sub Main()

  Dim bb As Byte[] = [10, 20, 30]
  Dim b As Byte
 
   Creaso()
 
' Passa alla funzione esterna "vettore()" la variabile array:
   vettore(bb)
   
   For Each b In bb
     Print b
   Next
 
End


Private Procedure Creaso()
 
' Crea il codice sorgente in C della libreria esterna:
  File.Save("/tmp/prova.c", "void vettore(char *bibi) {\n\n" &
            "   bibi[1] = 44;  /* Modifica il valore del 2° elemento */\n\n" &
            "}")
 
' Genera la libreria esterna condivisa .so che sarà utilizzata nel programma Gambas:'
  Shell "gcc -o /tmp/prova.so /tmp/prova.c -shared"
 
End
Titolo: Re:Librerie .so: Gambas può puntare ad un array ?
Inserito da: vuott - 26 Luglio 2019, 10:28:03
...nel caso di passaggio dell'array dalla libreria esterna a Gambas con la funzione "return", bisognerà utilizzare in Gambas una variabile di tipo Puntatore, giacché Gambas riceve un array dalla libreria in C, che è in definitiva, come sappiamo, un Puntatore.

Esempio:
Codice: [Seleziona]
Library "/tmp/prova"

' char * vettore()
Private Extern vettore() As Pointer


Public Sub Main()

  Dim p As Pointer
 
   Creaso()
 
   p = vettore()
   
' Legge i dati mediante l'apposita funzione di dereferenziazione e con l'aritmetica dei Puntatori:
   Print Byte@(p)
   Print Byte@(p + 1)
   Print Byte@(p + 2)
 
End


Private Procedure Creaso()
 
  File.Save("/tmp/prova.c", "char bibi[3];\n\n"
            "char * vettore() {\n\n"
            "   bibi[0] = 11;\n"
            "   bibi[1] = 22;\n"
            "   bibi[2] = 33;\n\n"
            "   return bibi;\n\n"
            "}")
 
  Shell "gcc -o /tmp/prova.so /tmp/prova.c -fPIC -shared"
 
End
Titolo: Re:Librerie .so: Gambas può puntare ad un array ?
Inserito da: Gianluigi - 26 Luglio 2019, 17:11:02
Dalla Francia alla Russia le lezioni di vuott sono ovunque apprezzate  :D
Titolo: Re:Librerie .so: Gambas può puntare ad un array ?
Inserito da: vuott - 26 Luglio 2019, 19:52:46
Dalla Francia alla Russia hanno rotto le palle.