Differenze tra le versioni di "Emulare una Lista Lineare mediante i soli Puntatori"
Da Gambas-it.org - Wikipedia.
Riga 7: | Riga 7: | ||
s As Short | s As Short | ||
i As Integer | i As Integer | ||
− | <FONT Color=gray>' ''L'ultimo membro della Struttura modello nelle "Linked List" è rappresentato da un "Puntatore", | + | <FONT Color=gray>' ''L'ultimo membro della Struttura modello nelle "Linked List" è rappresentato da un "Puntatore", il quale serve - come si sa - a creare e connettere un elemento della "Lista Lineare" a quello successivo:''</font> |
− | |||
p As Pointer | p As Pointer | ||
End Struct | End Struct | ||
Riga 20: | Riga 19: | ||
<FONT Color=gray>' ''Alloca un'area di memoria riservata per il primo elemento della "Lista Lineare":''</font> | <FONT Color=gray>' ''Alloca un'area di memoria riservata per il primo elemento della "Lista Lineare":''</font> | ||
− | + | p = Alloc(Object.SizeOf(STRUTTURA)) | |
− | + | prm = p | |
− | + | For i = 1 To 4 | |
− | + | st = Memory p For Write | |
− | |||
<FONT Color=gray>' ''Scrive nell'area riservata, puntata dal Puntatore, il primo valore (in questo caso è di tipo Byte):''</font> | <FONT Color=gray>' ''Scrive nell'area riservata, puntata dal Puntatore, il primo valore (in questo caso è di tipo Byte):''</font> | ||
− | + | Write #st, 11 * i As Byte | |
<FONT Color=gray>' ''Nel rispetto delle norme dell'<SPAN Style="text-decoration:underline">allineamento</span> effettua uno spostamento in avanti dell'indice nell'area riservata puntata dal Puntatore:''</font> | <FONT Color=gray>' ''Nel rispetto delle norme dell'<SPAN Style="text-decoration:underline">allineamento</span> effettua uno spostamento in avanti dell'indice nell'area riservata puntata dal Puntatore:''</font> | ||
− | + | Seek #st, 2 | |
<FONT Color=gray>' ''Scrive nell'area riservata, puntata dal Puntatore, il secondo valore (in questo caso è di tipo Short):''</font> | <FONT Color=gray>' ''Scrive nell'area riservata, puntata dal Puntatore, il secondo valore (in questo caso è di tipo Short):''</font> | ||
− | + | Write #st, 1111 * i As Short | |
<FONT Color=gray>' ''Scrive nell'area riservata, puntata dal Puntatore, il terzo valore (in questo caso è di tipo Integer):''</font> | <FONT Color=gray>' ''Scrive nell'area riservata, puntata dal Puntatore, il terzo valore (in questo caso è di tipo Integer):''</font> | ||
− | + | Write #st, 111111 * i As Integer | |
− | + | If i < 4 Then | |
<FONT Color=gray>' ''Alloca un'area di memoria riservata per il nuovo elemento della "Lista Lineare":''</font> | <FONT Color=gray>' ''Alloca un'area di memoria riservata per il nuovo elemento della "Lista Lineare":''</font> | ||
− | + | p = Alloc(Object.SizeOf(STRUTTURA)) | |
− | <FONT Color=gray>' ''Se non si è giunti all'ultimo elemento dela Lista, scrive nell'area riservata, puntata dal Puntatore, il quarto valore | + | <FONT Color=gray>' ''Se non si è giunti all'ultimo elemento dela Lista, scrive nell'area riservata, puntata dal Puntatore, il quarto valore (in questo caso è l'indirizzo di memoria della successiva area di memoria riservata per il nuovo elemento della Lista:''</font> |
− | + | Write #st, p As Pointer | |
− | + | Endif | |
− | + | st.Close | |
− | + | Next | |
− | + | VisualizzaLista(prm) | |
− | + | '''End''' | |
− | |||
− | '''End''' | ||
− | |||
'''Private''' Procedure VisualizzaLista(po As Pointer) | '''Private''' Procedure VisualizzaLista(po As Pointer) | ||
Riga 55: | Riga 50: | ||
Dim pu As Pointer | Dim pu As Pointer | ||
− | + | For b = 1 To 4 | |
− | + | Print Byte@(po) | |
− | + | Print Short@(po + 2) | |
− | + | Print Int@(po + 4) | |
− | + | pu = po | |
− | + | po = Pointer@(po + 8) | |
<FONT Color=gray>' ''Libera la memoria precedentemente allocata:''</font> | <FONT Color=gray>' ''Libera la memoria precedentemente allocata:''</font> | ||
− | + | Free(pu) | |
− | + | Next | |
'''End''' | '''End''' |
Versione delle 17:52, 18 giu 2023
E' possibile emulare in Gambas il loro comportamento e funzionamento delle "Liste Lineari" (Linked List) anche mediante le sole variabili di tipo Puntatore.
Mostriamo un esempio commentato:
' Impostiamo la "Struttura" modello: ci servirà soltanto per definire la dimensione delle aree di memoria da allocare, ciascuna delle quali rappresenterà un elemento della "Lista Lineare" concatenata: Public Struct STRUTTURA b As Byte s As Short i As Integer ' L'ultimo membro della Struttura modello nelle "Linked List" è rappresentato da un "Puntatore", il quale serve - come si sa - a creare e connettere un elemento della "Lista Lineare" a quello successivo: p As Pointer End Struct Public Sub Main() Dim p, prm As Pointer Dim i As Integer Dim st As Stream ' Alloca un'area di memoria riservata per il primo elemento della "Lista Lineare": p = Alloc(Object.SizeOf(STRUTTURA)) prm = p For i = 1 To 4 st = Memory p For Write ' Scrive nell'area riservata, puntata dal Puntatore, il primo valore (in questo caso è di tipo Byte): Write #st, 11 * i As Byte ' Nel rispetto delle norme dell'allineamento effettua uno spostamento in avanti dell'indice nell'area riservata puntata dal Puntatore: Seek #st, 2 ' Scrive nell'area riservata, puntata dal Puntatore, il secondo valore (in questo caso è di tipo Short): Write #st, 1111 * i As Short ' Scrive nell'area riservata, puntata dal Puntatore, il terzo valore (in questo caso è di tipo Integer): Write #st, 111111 * i As Integer If i < 4 Then ' Alloca un'area di memoria riservata per il nuovo elemento della "Lista Lineare": p = Alloc(Object.SizeOf(STRUTTURA)) ' Se non si è giunti all'ultimo elemento dela Lista, scrive nell'area riservata, puntata dal Puntatore, il quarto valore (in questo caso è l'indirizzo di memoria della successiva area di memoria riservata per il nuovo elemento della Lista: Write #st, p As Pointer Endif st.Close Next VisualizzaLista(prm) End Private Procedure VisualizzaLista(po As Pointer) Dim b As Byte Dim pu As Pointer For b = 1 To 4 Print Byte@(po) Print Short@(po + 2) Print Int@(po + 4) pu = po po = Pointer@(po + 8) ' Libera la memoria precedentemente allocata: Free(pu) Next End