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

Da Gambas-it.org - Wikipedia.
 
(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. In tal modo sarà possibile verificare se Gambas invia ad una funzione esterna ualsiasi i dati corretti.
+
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à l'indirizzo di memoria della predetta ''Struttura'' ad una funzione della predetta libreria esterna, da noi realizzata, per la verifica dei dati effettivamente passati.
  
 
+
====Passare l'indirizzo di memoria della Struttura, ottenuto con la funzione "VarPtr()"====
La libreria esterna in C sarà così costituita:
+
Public Struct prova
  void verifica(unsigned char *p) {
+
  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()
 +
 +
<FONT color=gray>' ''Va a generare l'apposita libreria esterna .so per la verifica:''</font>
 +
  Creaso()
 +
 +
<FONT color=gray>' ''Assegna dei valori ai campi della Struttura:''</font>
 +
  With pr
 +
    .a = 44
 +
    .b = 444
 +
    .c = 44444
 +
  End With
 +
 +
<FONT color=gray>' ''Assegna due valori anche 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))    <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
 +
 
 +
  verifica(VarPtr(vett))
 +
  <FONT color=gray>' ''oppure:'' '''verifica(vett.Data)'''</font>
 +
 +
End
 +
 
   
 
   
  int  i;
+
Private Procedure Creaso()
 
   
 
   
  printf("Valore puntatore: %x;\n dump:", (int) p);
+
  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}")
 
   
 
   
  for (i=0; i<8; i++)
+
  Shell "gcc -fPIC -o /tmp/libverifica.so /tmp/libverifica.c -shared" Wait
      printf(" %2.2x  ", *p++);
 
 
 
      printf("\n\n");
 
 
   
 
   
  }
+
  End
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:
+
====Passare l'indirizzo di memoria della Struttura, ottenuto con il Metodo "Object.Address()"====
  '''Public''' Struct prova
+
  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 Extern verifica(p As Pointer) In "/tmp/libverifica"
 
   
 
   
'''Private''' pr As Struct Prova
 
 
   
 
   
 +
Public Sub Main()
 
   
 
   
Library "/tmp/libverifica"
+
  Dim pr As New Prova
'''Private''' Extern verifica(p As Prova)
+
  Dim vett As New Byte[10]
 
   
 
   
 +
<FONT color=gray>' ''Va a generare l'apposita libreria esterna .so per la verifica:''</font>
 +
  Creaso()
 
   
 
   
  '''Private''' vett[10] As Byte
+
  <FONT color=gray>' ''Assegna dei valori ai campi della Struttura:''</font>
 +
  With pr
 +
    .a = 44
 +
    .b = 444
 +
    .c = 44444
 +
  End With
 
   
 
   
 +
<FONT color=gray>' ''Assegna due valori anche a due rispettivi elementi del vettore:''</font>
 +
  vett[0] = 5
 +
  vett[4] = 10
 +
   
 +
 
 +
<FONT color=gray>' '''Vengono mostrati in console i risultati'''</font>
 +
  verifica(Object.Address(pr) + 24) <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
 +
 
 +
  verifica(vett.Data)
 
   
 
   
  '''Public''' Sub Main()
+
  End
 
   
 
   
  Dim po As Pointer
 
 
   
 
   
 +
Private Procedure Creaso()
 
   
 
   
<FONT color=gray>' ''Genera l'apposita libreria esterna per la verifica:''</font>
+
  File.Save("/tmp/libverifica.c", "#include <stdio.h>\n\n" &
  Shell "gcc -fPIC -o /tmp/libverifica.so " & Application.Path &/ "libverifica.c -shared"
+
                                  "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}")
 
   
 
   
<FONT color=gray>' ''Assegnamo dei valori ai campi della Struttura:''</font>
+
  Shell "gcc -fPIC -o /tmp/libverifica.so /tmp/libverifica.c -shared" Wait
  With pr
 
    .a = 44
 
    .b = 444
 
    .c = 44444
 
  End With
 
 
   
 
   
  <FONT color=gray>' ''Assegnamo due valori a due rispettivi elmenti del vettore:''</font>
+
  End
  vett[0] = 5
+
 
  vett[4] = 10
+
 
   
+
 
 
+
=Note=
<FONT color=gray>' ''Vengono mostrati in console i risultati:''</font>
+
[1] Vedere la seguente pagina: [[Ottenere il puntatore di una variabile di tipo Struttura]]
  verifica(VarPtr(pr))
 
  verifica(pr)
 
   
 
  po = VarPtr(vett)
 
  verifica(po)
 
  verifica = vett.Data
 
  verifica(po)
 
 
'''End'''
 

Versione attuale delle 18:01, 7 giu 2024

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à l'indirizzo di memoria della predetta Struttura ad una funzione della predetta libreria esterna, da noi realizzata, per la verifica dei dati effettivamente passati.

Passare l'indirizzo di memoria della Struttura, ottenuto con la funzione "VarPtr()"

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()

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

' Assegna due valori anche a due rispettivi elementi del vettore:
 vett[0] = 5
 vett[4] = 10
   
 
' Vengono mostrati in console i risultati
 verifica(VarPtr(pr))    [nota 1]
 
 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

Passare l'indirizzo di memoria della Struttura, ottenuto con il Metodo "Object.Address()"

Public Struct prova
  a As Byte
  b As Short
  c As Integer
End Struct
 
Private Extern verifica(p As Pointer) In "/tmp/libverifica"


Public Sub Main()

 Dim pr As New Prova
 Dim vett As New Byte[10]

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

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

' Assegna due valori anche a due rispettivi elementi del vettore:
 vett[0] = 5
 vett[4] = 10
   
 
' Vengono mostrati in console i risultati
 verifica(Object.Address(pr) + 24) [nota 1]
 
 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


Note

[1] Vedere la seguente pagina: Ottenere il puntatore di una variabile di tipo Struttura