Scrivere una libreria esterna che ritorna una Linked List
Vai alla navigazione
Vai alla ricerca
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