Differenze tra le versioni di "Caricare i dati di un vettore scritto in C in un vettore di un'applicazione Gambas"

Da Gambas-it.org - Wikipedia.
Riga 4: Riga 4:
 
Mostriamo di seguito un semplice esempio.
 
Mostriamo di seguito un semplice esempio.
  
Il codice sorgente in C della futura libreria dinamica condivisa sarà il seguente:
+
Poniamo il caso che i dati della variabile vettoriale del codice sorgente C siano i seguenti:
 
  unsigned char vettore_C[] = {
 
  unsigned char vettore_C[] = {
 
     0x70, 0x7d, 0x86, 0x9a, 0xac, 0xb8, 0xbc, 0xc5,
 
     0x70, 0x7d, 0x86, 0x9a, 0xac, 0xb8, 0xbc, 0xc5,
 
     0x9d, 0xba, 0xd5, 0xe9, 0xf7, 0xfd, 0xfd, 0xf2
 
     0x9d, 0xba, 0xd5, 0xe9, 0xf7, 0xfd, 0xfd, 0xf2
 
  };
 
  };
 
int Dimensione_Vettore() {
 
 
    return sizeof(vettore_C);
 
 
}
 
il predetto codice sorgente potrà ad esempio essere salvato come: /tmp/Lib_C.c
 
  
 
+
Dal codice sorgente, nel quale è presente il predetto vettore, si genererà un'apposita libreria esterna dinamica condivisa .so . L'area di memoria del vettore, poi, sarà puntata in Gambas con il meotodo ''GetExternSymbol()'' della Classe ''System''. Ottenuto il relativo ''Puntatore'' a quell'area di memoria, poiché nel nostro caso non esistono valori uguali a zero, si leggerà all'interno dell'area medesima sino a quando non si giungerà al primo valore pari a zero, che rappresenta così l'uscita dall'area di memoria del vettore.
Quindi, il codice sorgente dell'applicativo Gambas potrà essere ad esempio:
 
Private Extern Dimensione_Vettore() As Integer In "/tmp/Lib_C"
 
 
 
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
   
 
   
 
   Dim p As Pointer
 
   Dim p As Pointer
   Dim d, i As Integer
+
   Dim i As Integer
 
   Dim bb As New Byte[]
 
   Dim bb As New Byte[]
 
    
 
    
 
  <FONT Color=gray>' ''Generiamo l'apposita libreria dinamica condivisa .so:''</font>
 
  <FONT Color=gray>' ''Generiamo l'apposita libreria dinamica condivisa .so:''</font>
   Creaso()
+
   CreaSo()
 
   
 
   
 
  <FONT Color=gray>' ''Puntiamo all'area di memoria della variabile vettoriale ora contenuta dall'apposita libreria dinamica .so:''</font>
 
  <FONT Color=gray>' ''Puntiamo all'area di memoria della variabile vettoriale ora contenuta dall'apposita libreria dinamica .so:''</font>
 
   p = System.GetExternSymbol("/tmp/Lib_C", "vettore_C")
 
   p = System.GetExternSymbol("/tmp/Lib_C", "vettore_C")
 
   If IsNull(p) Then Error.Raise("Puntatore NULLO !")
 
   If IsNull(p) Then Error.Raise("Puntatore NULLO !")
+
    
<FONT Color=gray>' ''E' necessario conoscere la quantità di byte presenti nella variabile vettoriale contenuta dall'apposita libreria dinamica .so:''</font>
+
  <FONT Color=gray>' ''Leggiamo dall'area di memoria della variabile vettoriale contenuta dallalibreria dinamica .so, fino a che il valore letto non sia zero''
   d = Dimensione_Vettore()
 
 
  <FONT Color=gray>' ''Leggiamo dall'area di memoria della variabile vettoriale contenuta dallalibreria dinamica .so,''
 
 
  ' ''ed assegnamo i valori, così letti, alla variabile vettoriale dell'applicazione Gambas:''</font>
 
  ' ''ed assegnamo i valori, così letti, alla variabile vettoriale dell'applicazione Gambas:''</font>
   For i = 1 To d
+
   While Byte@(p + i) > 0
     bb.Push(Byte@(p))
+
     bb.Push(Byte@(p + i))
     p = p + 1
+
     Inc i
   Next
+
   Wend
 
+
     
 
  <FONT Color=gray>' ''Vediamo semplicemente in console la quantità di elementi del vettore istanziati:''</font>
 
  <FONT Color=gray>' ''Vediamo semplicemente in console la quantità di elementi del vettore istanziati:''</font>
 
   Print bb.Count
 
   Print bb.Count
Riga 51: Riga 37:
 
    
 
    
 
   
 
   
  '''Private''' Procedure Creaso()
+
  '''Private''' Procedure CreaSo()
 +
 +
  File.Save("/tmp/Lib_C.c", "unsigned char vettore_C[] = {" &
 +
                            "0x70, 0x7d, 0x86, 0x9a, 0xac, 0xb8, 0xbc, 0xc5," &
 +
                            "\n0x9d, 0xba, 0xd5, 0xe9, 0xf7, 0xfd, 0xfd, 0xf2\n};")
 
      
 
      
 
   Shell "gcc -o /tmp/Lib_C.so /tmp/Lib_C.c -shared" Wait
 
   Shell "gcc -o /tmp/Lib_C.so /tmp/Lib_C.c -shared" Wait
+
 
 
  '''End'''
 
  '''End'''

Versione delle 18:14, 27 ago 2015

Se si ha un codice sorgente, scritto in C, nel quale vi è una variabile vettoriale globale istanziata con dei valori, per assumere e caricare tali valori in una variabile vettoriale di un'applicazione Gambas senza che vengano ricopiati manualmente nel codice sorgente di tale applicazione, si potrà copiare - qualora siano presenti anche altri simboli e risorse - la variabile vettoriale del sorgente C in un nuovo sorgente scritto sempre in linguaggio C, aggiungendovi anche una semplice funzione che restituisca la dimensione del vettore (ossia la quantità di byte/valori contenuti) e finalmente trasformata in un'apposita libreria dinamica condivisa .so da richiamare nell'applicazione Gambas.


Mostriamo di seguito un semplice esempio.

Poniamo il caso che i dati della variabile vettoriale del codice sorgente C siano i seguenti:

unsigned char vettore_C[] = {
   0x70, 0x7d, 0x86, 0x9a, 0xac, 0xb8, 0xbc, 0xc5,
   0x9d, 0xba, 0xd5, 0xe9, 0xf7, 0xfd, 0xfd, 0xf2
};

Dal codice sorgente, nel quale è presente il predetto vettore, si genererà un'apposita libreria esterna dinamica condivisa .so . L'area di memoria del vettore, poi, sarà puntata in Gambas con il meotodo GetExternSymbol() della Classe System. Ottenuto il relativo Puntatore a quell'area di memoria, poiché nel nostro caso non esistono valori uguali a zero, si leggerà all'interno dell'area medesima sino a quando non si giungerà al primo valore pari a zero, che rappresenta così l'uscita dall'area di memoria del vettore.

Public Sub Main()

 Dim p As Pointer
 Dim i As Integer
 Dim bb As New Byte[]
 
' Generiamo l'apposita libreria dinamica condivisa .so:
  CreaSo()

' Puntiamo all'area di memoria della variabile vettoriale ora contenuta dall'apposita libreria dinamica .so:
  p = System.GetExternSymbol("/tmp/Lib_C", "vettore_C")
  If IsNull(p) Then Error.Raise("Puntatore NULLO !")
  
' Leggiamo dall'area di memoria della variabile vettoriale contenuta dallalibreria dinamica .so, fino a che il valore letto non sia zero
' ed assegnamo i valori, così letti, alla variabile vettoriale dell'applicazione Gambas:
  While Byte@(p + i) > 0
    bb.Push(Byte@(p + i))
    Inc i
  Wend
     
' Vediamo semplicemente in console la quantità di elementi del vettore istanziati:
  Print bb.Count

End
 

Private Procedure CreaSo()

  File.Save("/tmp/Lib_C.c", "unsigned char vettore_C[] = {" &
                            "0x70, 0x7d, 0x86, 0x9a, 0xac, 0xb8, 0xbc, 0xc5," &
                            "\n0x9d, 0xba, 0xd5, 0xe9, 0xf7, 0xfd, 0xfd, 0xf2\n};")
   
  Shell "gcc -o /tmp/Lib_C.so /tmp/Lib_C.c -shared" Wait
  
End