Differenze tra le versioni di "Emulare una Lista Lineare mediante i soli Puntatori"

Da Gambas-it.org - Wikipedia.
 
(Una versione intermedia di uno stesso utente non è mostrata)
Riga 1: Riga 1:
E' possibile emulare in Gambas il loro comportamento e funzionamento delle "''Liste Lineari''" (''Linked List'') anche mediante le sole variabili di tipo ''Puntatore''.
+
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:
 
Mostriamo un esempio commentato:
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>
' ''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))
+
  p = Alloc(Object.SizeOf(STRUTTURA))
  prm = p
+
  prm = p
 
            
 
            
  For i = 1 To 4
+
  For i = 1 To 4
     
+
    st = Memory p For Write
    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
+
    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
+
    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
+
    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
+
    Write #st, 111111 * i As Integer
    If i < 4 Then
+
    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))
+
      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>
' ''(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
      Write #st, p As Pointer
+
    Endif
    Endif
+
    st.Close
    st.Close
+
  Next
 
      
 
      
  Next
+
  VisualizzaLista(prm)
 
      
 
      
  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
+
  For b = 1 To 4
    Print Byte@(po)
+
    Print Byte@(po)
    Print Short@(po + 2)
+
    Print Short@(po + 2)
    Print Int@(po + 4)
+
    Print Int@(po + 4)
    pu = po
+
    pu = po
    po = Pointer@(po + 8)
+
    po = Pointer@(po + 8)
 
  <FONT Color=gray>' ''Libera la memoria precedentemente allocata:''</font>
 
  <FONT Color=gray>' ''Libera la memoria precedentemente allocata:''</font>
    Free(pu)
+
    Free(pu)
  Next
+
  Next
 
    
 
    
 
  '''End'''
 
  '''End'''

Versione attuale 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