Autore Topic: Librerie .so: Gambas può puntare ad un array ?  (Letto 414 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.726
  • Ne mors quidem nos iunget
    • Mostra profilo
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.726
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Librerie .so: Gambas può puntare ad un array ?
« Risposta #1 il: 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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.726
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Librerie .so: Gambas può puntare ad un array ?
« Risposta #2 il: 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
« Ultima modifica: 26 Luglio 2019, 11:04:38 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.239
  • Tonno verde
    • Mostra profilo
Re:Librerie .so: Gambas può puntare ad un array ?
« Risposta #3 il: 26 Luglio 2019, 17:11:02 »
Dalla Francia alla Russia le lezioni di vuott sono ovunque apprezzate  :D
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.726
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Librerie .so: Gambas può puntare ad un array ?
« Risposta #4 il: 26 Luglio 2019, 19:52:46 »
Dalla Francia alla Russia hanno rotto le palle.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »