Differenze tra le versioni di "Verificare quali dati Gambas passa ad una funzione esterna"

Da Gambas-it.org - Wikipedia.
(Creata pagina con 'Per sapere quali dati Gambas invia ad una funzione esterna, dovremo servirci di un'apposita libreria esterna in C che ci restituirà i risultati dei dati effettivi passati da ...')
 
 
(7 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Per sapere quali dati Gambas invia ad una funzione esterna, dovremo servirci di un'apposita libreria esterna in C che ci restituirà i risultati dei dati effettivi passati da Gambas.
+
Per sapere quali dati Gambas invia ad una funzione esterna, dovremo servirci di un'apposita libreria esterna in C che ci restituirà i risultati dei dati effettivi passati da Gambas. In tal modo sarà possibile verificare se Gambas invia ad una funzione esterna qualsiasi i dati corretti.
  
Nell'esempio, che utilizzeremo in questa pagina, abbiamo un apllicativo Gambas che riempie una ''Struttura'' ed una variabile vettoriale con alcuni dati. L'applicativo, poi, passerà ad una funzione della predetta libreria esterna, da noi realizzata, per la verifica dei dati effettivamente passati.
+
Nell'esempio, che utilizzeremo in questa pagina, abbiamo un applicativo Gambas che riempie una ''Struttura'' ed una variabile vettoriale con alcuni dati. <BR>L'applicativo, poi, passerà ad una funzione della predetta libreria esterna, da noi realizzata, per la verifica dei dati effettivamente passati.
 
+
<BR>Il codice dell'applicativo Gambas sarà il seguente:
 
+
  Public Struct prova
La libreria esterna in C sarà così costituita:
 
void verifica(unsigned char *p) {
 
 
  int  i;
 
 
  printf("Valore puntatore: %x;\n dump:", (int) p);
 
 
  for (i=0; i<8; i++)
 
      printf("  %2.2x  ", *p++);
 
 
 
      printf("\n\n");
 
 
}
 
Il file di tale codice C sarà aslavo e posto nella cartella ''Dati'' dell'aplicativo Gambas.
 
 
 
 
 
Il codice dell'applicativo Gambas sarà a sua volta il seguente:
 
  '''Public''' Struct prova
 
 
   a As Byte
 
   a As Byte
 
   b As Short
 
   b As Short
 
   c As Integer
 
   c As Integer
  '''End''' Struct
+
  End Struct
 
   
 
   
  '''Private''' pr As Struct Prova
+
  Private pr As Struct Prova
 +
Private vett[10] As Byte
 +
 
 +
Private Extern verifica(p As Pointer) In "/tmp/libverifica"
 
   
 
   
 
   
 
   
Library "/tmp/libverifica"
+
  '''Public''' Sub Main()
  '''Private''' Extern verifica(p As Prova)
 
 
   
 
   
 +
<FONT color=gray>' ''Va a generare l'apposita libreria esterna .so per la verifica:''</font>
 +
  Creaso()
 
   
 
   
  '''Private''' vett[10] As Byte
+
  <FONT color=gray>' ''Assegniamo dei valori ai campi della Struttura:''</font>
 +
  With pr
 +
    .a = 44
 +
    .b = 444
 +
    .c = 44444
 +
  End With
 
   
 
   
 +
<FONT color=gray>' ''Assegniamo due valori a due rispettivi elementi del vettore:''</font>
 +
  vett[0] = 5
 +
  vett[4] = 10
 +
   
 +
 
 +
<FONT color=gray>' ''Vengono mostrati in console i risultati:''</font>
 +
  verifica(VarPtr(pr))
 +
<FONT color=gray>' ''oppure:'' '''verifica(Object.Address(pr))'''</font>
 +
 
 +
  verifica(VarPtr(vett))
 +
  <FONT color=gray>' ''oppure:'' '''verifica(vett.Data)'''</font>
 
   
 
   
  '''Public''' Sub Main()
+
  '''End'''
 
  Dim po As Pointer
 
 
 
   
 
   
  <FONT color=gray>' ''Genera l'apposita libreria esterna per la verifica:''</font>
+
  '''Private''' Procedure Creaso()
  Shell "gcc -fPIC -o /tmp/libverifica.so " & Application.Path &/ "libverifica.c -shared"
 
 
   
 
   
<FONT color=gray>' ''Assegnamo dei valori ai campi della Struttura:''</font>
+
  File.Save("/tmp/libverifica.c", "#include <stdio.h>\n\n" &
  With pr
+
                                  "void verifica(unsigned char *p) {\n" &
    .a = 44
+
                                  "  int  i;\n" &
    .b = 444
+
                                  "  printf(\"Valore puntatore: %x;\\n dump:\", (int) *p);\n" &
    .c = 44444
+
                                  "  for (i=0; i<8; i++)\n" &
  End With
+
                                  "    printf(\"  %2.2x  \", *p++);\n" &
 +
                                  "  printf(\"\\n\\n\");\n}")
 
   
 
   
<FONT color=gray>' ''Assegnamo due valori a due rispettivi elmenti del vettore:''</font>
+
  Shell "gcc -fPIC -o /tmp/libverifica.so /tmp/libverifica.c -shared" Wait
  vett[0] = 5
 
  vett[4] = 10
 
   
 
 
 
<FONT color=gray>' ''Vengono mostrati in console i risultati:''</font>
 
  verifica(VarPtr(pr))
 
  verifica(pr)
 
   
 
  po = VarPtr(vett)
 
  verifica(po)
 
  verifica = vett.Data
 
  verifica(po)
 
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione attuale delle 05:48, 8 dic 2021

Per sapere quali dati Gambas invia ad una funzione esterna, dovremo servirci di un'apposita libreria esterna in C che ci restituirà i risultati dei dati effettivi passati da Gambas. In tal modo sarà possibile verificare se Gambas invia ad una funzione esterna qualsiasi i dati corretti.

Nell'esempio, che utilizzeremo in questa pagina, abbiamo un applicativo Gambas che riempie una Struttura ed una variabile vettoriale con alcuni dati.
L'applicativo, poi, passerà ad una funzione della predetta libreria esterna, da noi realizzata, per la verifica dei dati effettivamente passati.
Il codice dell'applicativo Gambas sarà il seguente:

Public Struct prova
  a As Byte
  b As Short
  c As Integer
End Struct

Private pr As Struct Prova
Private vett[10] As Byte
 
Private Extern verifica(p As Pointer) In "/tmp/libverifica"


Public Sub Main()

' Va a generare l'apposita libreria esterna .so per la verifica:
 Creaso()

' Assegniamo dei valori ai campi della Struttura:
 With pr
   .a = 44
   .b = 444
   .c = 44444
 End With

' Assegniamo due valori a due rispettivi elementi del vettore:
 vett[0] = 5
 vett[4] = 10
   
 
' Vengono mostrati in console i risultati:
 verifica(VarPtr(pr))
' oppure: verifica(Object.Address(pr))
 
 verifica(VarPtr(vett))
 ' oppure: verifica(vett.Data)

End

Private Procedure Creaso()

 File.Save("/tmp/libverifica.c", "#include <stdio.h>\n\n" &
                                 "void verifica(unsigned char *p) {\n" &
                                 "   int   i;\n" &
                                 "   printf(\"Valore puntatore: %x;\\n dump:\", (int) *p);\n" &
                                 "   for (i=0; i<8; i++)\n" &
                                 "     printf(\"  %2.2x  \", *p++);\n" &
                                 "   printf(\"\\n\\n\");\n}")

 Shell "gcc -fPIC -o /tmp/libverifica.so /tmp/libverifica.c -shared" Wait

End