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:
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
...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:
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