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>[[[#Note| | + | 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>[[[#Note|nota 1]]]</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. | |
− | + | Library "/tmp/liblista" | |
− | |||
− | |||
− | Library "/tmp/ | ||
<FONT Color=gray>' ''struct elemento * lista()'' | <FONT Color=gray>' ''struct elemento * lista()'' | ||
Riga 12: | Riga 9: | ||
− | + | Public Sub Main() | |
− | + | ||
Dim p1, p2 As Pointer | Dim p1, p2 As Pointer | ||
Dim b As Byte | Dim b As Byte | ||
− | + | ||
− | + | 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() | |
− | + | ||
− | + | 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) | |
− | <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> |
− | + | p2 = Pointer@(p1 + SizeOf(gb.Pointer)) | |
− | + | ||
− | |||
<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) | |
− | <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> |
− | + | p1 = Pointer@(p2 + SizeOf(gb.Pointer)) | |
− | + | Next | |
− | |||
− | |||
− | |||
+ | End | ||
− | + | ||
− | + | Private Procedure CreaSo() | |
− | File.Save("/tmp/ | + | |
+ | 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}; | + | " 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/ | + | Shell "gcc -o /tmp/liblista.so /tmp/liblista.c -shared -fPIC" Wait |
− | + | End | |
− | |||
=Note= | =Note= | ||
− | [1] Vedi anche: | + | [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