Differenze tra le versioni di "Assegnare un valore ad una Struttura di una libreria esterna scrivendo con i Memory Stream nella sua area di memoria"

Da Gambas-it.org - Wikipedia.
 
(5 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
E' possibile passare un valore ad una ''Struttura'', presente nel codice di una libreria esterna, scrivendo con i ''[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]'' direttamente all'interno della sua area di memoria il cui indirizzo è contenuto da un puntatore. L'attribuzione del valore ad uno o più membri di detta ''Struttura'' <SPAN Style="text-decoration:underline">non</span> avverrà nel modo consueto attraverso l'assegnazione del valore
 
E' possibile passare un valore ad una ''Struttura'', presente nel codice di una libreria esterna, scrivendo con i ''[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]'' direttamente all'interno della sua area di memoria il cui indirizzo è contenuto da un puntatore. L'attribuzione del valore ad uno o più membri di detta ''Struttura'' <SPAN Style="text-decoration:underline">non</span> avverrà nel modo consueto attraverso l'assegnazione del valore
 
  ''Variabile_Struttura.Membro = valore''
 
  ''Variabile_Struttura.Membro = valore''
bensì andando a manipolare internamente all'area di memoria appartenente alla ''Struttura'' medesima.
+
<SPAN Style="text-decoration:underline">bensì</span> andando a manipolare internamente all'area di memoria appartenente alla ''Struttura'' medesima.
  
  
 
Mostriamo un semplice esempio, in cui abbiamo una libreria esterna scritta in C da noi, nella quale è presente una funzione che sarà chiamata più volte dal programma principale Gambas ed alla quale verrà modificato, ad ogni chiamata, il primo membro di tipo ''Char'' della Struttura presente nella libreria medesima:
 
Mostriamo un semplice esempio, in cui abbiamo una libreria esterna scritta in C da noi, nella quale è presente una funzione che sarà chiamata più volte dal programma principale Gambas ed alla quale verrà modificato, ad ogni chiamata, il primo membro di tipo ''Char'' della Struttura presente nella libreria medesima:
  <FONT Color=gray>' ''struct AAA * Prova() {''</font>
+
  <FONT Color=gray>' ''struct AAA * Prova(int i)''</font>
  Private Extern Prova() As Pointer In "/tmp/libreria_esterna"
+
  Private Extern prova(i As Integer) As Pointer In "/tmp/libreria_esterna"
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim p As Pointer
 
   Dim p As Pointer
Riga 19: Riga 19:
 
    
 
    
 
  <FONT Color=gray>' ''Invochiamo la funzione esterna e ne raccogliamo con un "Puntatore" l'indirizzo di memoria della Struttura esterna passata dalla funzione medesima:''</font>
 
  <FONT Color=gray>' ''Invochiamo la funzione esterna e ne raccogliamo con un "Puntatore" l'indirizzo di memoria della Struttura esterna passata dalla funzione medesima:''</font>
   p = Prova()
+
   p = prova(0)
 
   
 
   
 
  <FONT Color=gray>' ''Generiamo lo "Stream" in lettura e scrittura:''</font>
 
  <FONT Color=gray>' ''Generiamo lo "Stream" in lettura e scrittura:''</font>
Riga 29: Riga 29:
 
     Print j, b, Hex(b, 2)
 
     Print j, b, Hex(b, 2)
 
   Next
 
   Next
   
+
 +
  Print
 +
 
  <FONT Color=gray>' ''Scriviamo il nuovo valore in un byte preciso dell'area di memoria della Struttura esterna":''</font>
 
  <FONT Color=gray>' ''Scriviamo il nuovo valore in un byte preciso dell'area di memoria della Struttura esterna":''</font>
 
   For k = 0 To 9
 
   For k = 0 To 9
Riga 35: Riga 37:
 
     Write #st, 65 + k As Byte
 
     Write #st, 65 + k As Byte
 
  <FONT Color=gray>' ''Andiamo a leggere nel 1° byte (indice 0) dell'area di memoria della Struttura esterna, per vedere il nuovo valore del primo membro di tipo "Char":''</font>
 
  <FONT Color=gray>' ''Andiamo a leggere nel 1° byte (indice 0) dell'area di memoria della Struttura esterna, per vedere il nuovo valore del primo membro di tipo "Char":''</font>
     p = Prova()
+
     p = Prova(k)
 
     Seek #st, 0
 
     Seek #st, 0
 
     Read #st, b
 
     Read #st, b
     Print "\n\n"; b, Hex(b, 2)  
+
     Print "\n"; b, Hex(b, 2)  
 
   Next
 
   Next
 
    
 
    
 
   st.Close
 
   st.Close
 
   
 
   
  '''End'''
+
  End
 +
 
    
 
    
  '''Private''' Procedure Creaso()
+
  Private Procedure Creaso()
 
    
 
    
 
   File.Save("/tmp/libreria_esterna.c", "#include <stdio.h>\n#include <unistd.h>\n\n" &
 
   File.Save("/tmp/libreria_esterna.c", "#include <stdio.h>\n#include <unistd.h>\n\n" &
Riga 54: Riga 57:
 
             "  int i;\n};\n\n" &
 
             "  int i;\n};\n\n" &
 
             "struct AAA as;\n\n" &
 
             "struct AAA as;\n\n" &
             "int n;\n\n" &
+
             "<FONT Color=green>struct AAA *</font> prova(int i) {\n\n" &
            "struct AAA * Prova() {\n\n" &
 
 
             "<FONT Color=gray>/* Nella prima chiamata della funzione esterna, il primo membro avrà il valore del carattere \"A\": */</font>\n" &
 
             "<FONT Color=gray>/* Nella prima chiamata della funzione esterna, il primo membro avrà il valore del carattere \"A\": */</font>\n" &
             "  if (0==n) as.c = 'A';\n\n" &
+
             "  if (0==i) as.c = 'A';\n\n" &
 
             "<FONT Color=gray>/* Assegnamo i valori agli altri membri: */</font>\n" &
 
             "<FONT Color=gray>/* Assegnamo i valori agli altri membri: */</font>\n" &
 
             "  as.s = 888;\n" &
 
             "  as.s = 888;\n" &
 
             "  as.s2 = 888;\n" &
 
             "  as.s2 = 888;\n" &
 
             "  as.i = 305419896;\n\n" &
 
             "  as.i = 305419896;\n\n" &
            "  ++n;\n\n" &
 
 
             "<FONT Color=gray>/* Mostriamo l'attuale valore assegnato al primo membro - di tipo \"Char\" della Struttura: */</font>\n" &
 
             "<FONT Color=gray>/* Mostriamo l'attuale valore assegnato al primo membro - di tipo \"Char\" della Struttura: */</font>\n" &
 
             "  printf(\"%c\\n\", as.c);\n\n" &
 
             "  printf(\"%c\\n\", as.c);\n\n" &
 
             "<FONT Color=gray>/* Passiamo al programma in Gambas l'indirizzo di memoria della Struttura: */</font>\n" &
 
             "<FONT Color=gray>/* Passiamo al programma in Gambas l'indirizzo di memoria della Struttura: */</font>\n" &
             "  return &as;\n\n}")
+
             "  return <FONT Color=green>&</font>as;\n\n}")
 
   
 
   
 
   Shell "gcc -o /tmp/libreria_esterna.so /tmp/libreria_esterna.c -shared -fPIC" Wait
 
   Shell "gcc -o /tmp/libreria_esterna.so /tmp/libreria_esterna.c -shared -fPIC" Wait
 
    
 
    
  '''End'''
+
  End

Versione attuale delle 12:28, 16 nov 2024

E' possibile passare un valore ad una Struttura, presente nel codice di una libreria esterna, scrivendo con i Memory Stream direttamente all'interno della sua area di memoria il cui indirizzo è contenuto da un puntatore. L'attribuzione del valore ad uno o più membri di detta Struttura non avverrà nel modo consueto attraverso l'assegnazione del valore

Variabile_Struttura.Membro = valore

bensì andando a manipolare internamente all'area di memoria appartenente alla Struttura medesima.


Mostriamo un semplice esempio, in cui abbiamo una libreria esterna scritta in C da noi, nella quale è presente una funzione che sarà chiamata più volte dal programma principale Gambas ed alla quale verrà modificato, ad ogni chiamata, il primo membro di tipo Char della Struttura presente nella libreria medesima:

' struct AAA * Prova(int i)
Private Extern prova(i As Integer) As Pointer In "/tmp/libreria_esterna"


Public Sub Main()

 Dim p As Pointer
 Dim st As Stream
 Dim b, j, k As Byte
  
' Creiamo la libreria dinamica condivisa esterna contenente la funzione da richiamare più volte:
 Creaso()
  
' Invochiamo la funzione esterna e ne raccogliamo con un "Puntatore" l'indirizzo di memoria della Struttura esterna passata dalla funzione medesima:
 p = prova(0)

' Generiamo lo "Stream" in lettura e scrittura:
 st = Memory p For Read Write

' Andiamo a leggere nell'area di memoria della Struttura esterna, per vedere i valori "iniziali" della Struttura esterna":
 For j = 0 To 15
   Read #st, b
   Print j, b, Hex(b, 2)
 Next

 Print

' Scriviamo il nuovo valore in un byte preciso dell'area di memoria della Struttura esterna":
 For k = 0 To 9
   Seek #st, 0
   Write #st, 65 + k As Byte
' Andiamo a leggere nel 1° byte (indice 0) dell'area di memoria della Struttura esterna, per vedere il nuovo valore del primo membro di tipo "Char":
   p = Prova(k)
   Seek #st, 0
   Read #st, b
   Print "\n"; b, Hex(b, 2) 
 Next
 
 st.Close

End

 
Private Procedure Creaso()
 
 File.Save("/tmp/libreria_esterna.c", "#include <stdio.h>\n#include <unistd.h>\n\n" &
           "struct AAA {\n" &
           "  char c;\n" &
           "  short int s;" &
           "  short int s2;" &
           "  int i;\n};\n\n" &
           "struct AAA as;\n\n" &
           "struct AAA * prova(int i) {\n\n" &
           "/* Nella prima chiamata della funzione esterna, il primo membro avrà il valore del carattere \"A\": */\n" &
           "   if (0==i) as.c = 'A';\n\n" &
           "/* Assegnamo i valori agli altri membri: */\n" &
           "   as.s = 888;\n" &
           "   as.s2 = 888;\n" &
           "   as.i = 305419896;\n\n" &
           "/* Mostriamo l'attuale valore assegnato al primo membro - di tipo \"Char\" della Struttura: */\n" &
           "   printf(\"%c\\n\", as.c);\n\n" &
           "/* Passiamo al programma in Gambas l'indirizzo di memoria della Struttura: */\n" &
           "   return &as;\n\n}")

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