Differenze tra le versioni di "Scrivere una libreria esterna che ritorna una Linked List"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "Una "''Linked List''", o ''Lista lineare'', è una successione di elementi omogenei di tipo ''Struttura'' che occupano - a differenza degli elementi di un ''array'' - un quals...")
 
 
(5 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Una "''Linked List''", o ''Lista lineare'', è una successione di elementi omogenei di tipo ''Struttura'' che occupano - a differenza degli elementi di un ''array'' - un qualsiasi indirizzo di memoria (dunque non necessariamente successivi e adiacenti). <SUP>&#091;[[#Note|Nota 1&#093;]]</sup>
+
Una "''Linked List''", o ''Lista lineare'', è una successione di elementi omogenei di tipo ''Struttura'' che occupano - a differenza degli elementi di un ''array'' - un qualsiasi indirizzo di memoria (dunque non necessariamente successivi e adiacenti). <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
  
 
+
Mostriamo un semplice esempio pratico di come scrivere in una libreria esterna condivisa .so una ''Lista Lineare'', e soprattutto di come gestirla in Gambas successivamente alla valorizzazione del/i suo/i membro/i.
Nell'esempio che segue mostreremo un semplice esempio pratico di come scrivere in una libreria esterna dinamica condivisa .so una ''Lista Lineare'', e soprattutto di come gestirla in Gambas successivamente alla valorizzazione del/i suo/i membro/i.
+
  Library "/tmp/liblista"
 
 
 
 
  Library "/tmp/lib"
 
 
   
 
   
 
  <FONT Color=gray>' ''struct elemento * lista()''
 
  <FONT Color=gray>' ''struct elemento * lista()''
Riga 12: Riga 9:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
+
 
   Dim p1, p2 As Pointer
 
   Dim p1, p2 As Pointer
 
   Dim b As Byte
 
   Dim b As Byte
    
+
  CreaSo()
+
   CreaSo()
 
+
 
  <FONT Color=gray>' ''La funzione esterna ritorna la lista creata e popolata:''</font>
 
  <FONT Color=gray>' ''La funzione esterna ritorna la lista creata e popolata:''</font>
  p1 = lista()
+
  p1 = lista()
 
+
  For b = 1 To 5
+
  For b = 1 To 5
 
  <FONT Color=gray>' ''Dereferenzia il primo membro dell'elemento Struttura corrente della lista:''</font>
 
  <FONT Color=gray>' ''Dereferenzia il primo membro dell'elemento Struttura corrente della lista:''</font>
    Print Int@(p1)
+
    Print Int@(p1)
  <FONT Color=gray>' ''Avanza di 8 byte nell'area di memoria riservata dell'elemento Struttura''
+
  <FONT Color=gray>' ''Avanza di 8 byte nell'area di memoria riservata dell'elemento Struttura corrente della lista e ne ottiene l'indirizzo di memoria:''</font>
' ''corrente della lista e ne ottiene l'indirizzo di memoria:''</font>
+
    p2 = Pointer@(p1 + SizeOf(gb.Pointer))
    p2 = Pointer@(p1 + 8)
+
   
   
 
 
  <FONT Color=gray>' ''Dereferenzia il primo membro dell'attuale elemento Struttura della lista:''</font>
 
  <FONT Color=gray>' ''Dereferenzia il primo membro dell'attuale elemento Struttura della lista:''</font>
    Print Int@(p2)
+
    Print Int@(p2)
  <FONT Color=gray>' ''Avanza di 8 byte nell'area di memoria riservata dell'elemento Struttura''
+
  <FONT Color=gray>' ''Avanza di 8 byte nell'area di memoria riservata dell'elemento Struttura corrente della lista e ne ottiene l'indirizzo di memoria:''</font>
' ''corrente della lista e ne ottiene l'indirizzo di memoria:''</font>
+
    p1 = Pointer@(p2 + SizeOf(gb.Pointer))
    p1 = Pointer@(p2 + 8)
+
  Next
  Next
 
 
 
'''End'''
 
 
   
 
   
 +
End
 
   
 
   
  '''Private''' Procedure CreaSo()
+
   
 
+
Private Procedure CreaSo()
   File.Save("/tmp/lib.c", "#include <stdlib.h>\n\n\n" &
+
 +
   File.Save("/tmp/liblista.c", "#include <stdlib.h>\n\n\n" &
 
             "struct elemento {\n" &
 
             "struct elemento {\n" &
 
             "  int i;\n" &
 
             "  int i;\n" &
             "  struct elemento *pun;\n};\n\n\n" &
+
             "  struct elemento *pun;\n};\n\n" &
 
             "struct elemento * lista() {\n\n" &
 
             "struct elemento * lista() {\n\n" &
 
             "  struct elemento *p, *paus;\n" &
 
             "  struct elemento *p, *paus;\n" &
Riga 58: Riga 53:
 
             "  return p;\n\n}")
 
             "  return p;\n\n}")
 
              
 
              
   Shell "gcc -o /tmp/lib.so /tmp/lib.c -shared -fPIC" Wait
+
   Shell "gcc -o /tmp/liblista.so /tmp/liblista.c -shared -fPIC" Wait
 
    
 
    
  '''End'''
+
  End
 
 
  
  
  
 
=Note=
 
=Note=
[1] Vedi anche: http://www.gambas-it.org/wiki/index.php?title=Emulare_una_%27Lista_Lineare%27_mediante_una_Struttura_di_testa_ed_i_Puntatori
+
[1] Vedi anche: [[Emulare una 'Lista Lineare' mediante una Struttura di testa ed i Puntatori]]

Versione attuale delle 21:28, 4 lug 2023

Una "Linked List", o Lista lineare, è una successione di elementi omogenei di tipo Struttura che occupano - a differenza degli elementi di un array - un qualsiasi indirizzo di memoria (dunque non necessariamente successivi e adiacenti). [nota 1]

Mostriamo un semplice esempio pratico di come scrivere in una libreria esterna condivisa .so una Lista Lineare, e soprattutto di come gestirla in Gambas successivamente alla valorizzazione del/i suo/i membro/i.

Library "/tmp/liblista"

' struct elemento * lista()
' Crea la Lista e ritorna un Puntatore ad essa.
Private Extern lista() As Pointer


Public Sub Main()

 Dim p1, p2 As Pointer
 Dim b As Byte

 CreaSo()

' La funzione esterna ritorna la lista creata e popolata:
 p1 = lista()

 For b = 1 To 5
' Dereferenzia il primo membro dell'elemento Struttura corrente della lista:
   Print Int@(p1)
' Avanza di 8 byte nell'area di memoria riservata dell'elemento Struttura corrente della lista e ne ottiene l'indirizzo di memoria:
   p2 = Pointer@(p1 + SizeOf(gb.Pointer))
   
' Dereferenzia il primo membro dell'attuale elemento Struttura della lista:
   Print Int@(p2)
' Avanza di 8 byte nell'area di memoria riservata dell'elemento Struttura corrente della lista e ne ottiene l'indirizzo di memoria:
   p1 = Pointer@(p2 + SizeOf(gb.Pointer))
 Next

End


Private Procedure CreaSo()

 File.Save("/tmp/liblista.c", "#include <stdlib.h>\n\n\n" &
           "struct elemento {\n" &
           "   int i;\n" &
           "   struct elemento *pun;\n};\n\n" &
           "struct elemento * lista() {\n\n" &
           "   struct elemento *p, *paus;\n" &
           "   int i;\n\n" &
           "   p = malloc(sizeof(struct elemento));" &
           "   p->i = 100;\n" &
           "   paus = p;\n\n" &
           "   for (i=2; i<11; i++) {\n" &
           "     paus->pun = malloc(sizeof(struct elemento));\n" &
           "     paus = paus->pun;\n" &
           "     paus->i = 100 * i;\n}\n\n" &
           "   paus->pun = NULL;\n\n" &
           "   return p;\n\n}")
           
 Shell "gcc -o /tmp/liblista.so /tmp/liblista.c -shared -fPIC" Wait
 
End


Note

[1] Vedi anche: Emulare una 'Lista Lineare' mediante una Struttura di testa ed i Puntatori