Emulare una Lista Lineare mediante i soli Puntatori
Da Gambas-it.org - Wikipedia.
Versione del 18 giu 2023 alle 17:52 di Vuott (Discussione | contributi)
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