You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
ma, cioè quelle i cui elementi sono i task, le librerie, i se-<br />
mafori, ecc., sono liste doppie.<br />
Le liste doppie sono particolarmente interessanti perché<br />
Exec fornisce un insieme di funzioni per la loro gestione.<br />
Se studiamo quindi il modo in cui sono realizzate le liste<br />
di sistema, possiamo utilizzare nei nostri programmi delle<br />
liste doppie analoghe a quelle di sistema, sfruttando i<br />
servizi offerti da Exec, ma nelle quali possiamo inserire<br />
qualunque tipo di informazione. Per esempio, se la no-<br />
stra applicazione è un word processor, potremmo defini-<br />
re l'elemento "linea di testo" e rappresentare il testo co-<br />
me una lista (doppia) di linee di testo.<br />
Anche se le procedure che operano sulle liste non sono<br />
particolarmente lunghe o difficili da scrivere, l'idea di ri-<br />
correre a quelle fornite da <strong>Amiga</strong> si prefigge un duplice<br />
scopo: da un lato capire come i programmatori di <strong>Amiga</strong><br />
abbiano realizzato una (piccola, ma importante) parte del<br />
nostro sistema, dall'altro lavorare nell'ottica del riutilizzo<br />
del software. Infatti se qualcuno ha già scritto delle pro-<br />
cedure, che si presume siano efficienti e ampiamente te-<br />
state, che bisogno c'è di rifarle?<br />
I nodi e le liste di Exec<br />
Per comprendere come sono realizzate le strutture a lista<br />
su <strong>Amiga</strong>, dobbiamo esaminare i due file include<br />
exec/nodes.h ed exec/lists.h. Infatti, il concetto astratto<br />
di lista come insieme di elementi è implementato in pra-<br />
tica da due tipi di oggetti: i nodi, che sono i singoli ele-<br />
menti della lista, e gli header di lista, particolari strutture<br />
che ci permettono di trattare la lista come un tutto unico.<br />
Un nodo può esistere senza essere inserito in una lista e<br />
viceversa una lista può essere vuota, cioè essere formata<br />
dal solo header e non contenere alcun nodo.<br />
Nel file exec/nodes.h troviamo definite due tipi di strut-<br />
ture nodo:<br />
struct Node {<br />
struct Node *In-Succ;<br />
struct Node *In-Pred;<br />
UBYTE In-Type;<br />
>;<br />
BYTE In-Pri;<br />
char *lnName;<br />
struct MinNode {<br />
struct MinNode *mln-Succ;<br />
struct MinNode *mln-Pred;<br />
} :<br />
Le parti "comuni" alle due strutture sono i puntatori<br />
all'elemento successivo (In-Succ, mln-Succ) e all'elemen-<br />
to precedente (In-Pred, mln-Pred) nella lista. La struct<br />
Node ha in più tre campi che sono utilizzati nella gestio-<br />
ne delle liste di sistema:<br />
n-Type indica il tipo di elemento che contiene il nodo<br />
In-Pri dà la priorità di questo nodo rispetto agli altri<br />
della lista<br />
In-Name permette di associare un nome a questo no-<br />
do<br />
In questo articolo non tratteremo le liste di sistema nei<br />
dettagli, quindi vedremo il significato di questi ulteriori<br />
campi solo in relazione alle funzioni offerte da Exec che<br />
possiamo usare nei nostri programmi.<br />
I1 file exe4ists.h contiene invece le definizioni degli<br />
header di lista:<br />
struct List {<br />
struct Node *lh-Head;<br />
struct Node *lh-Tail;<br />
struct Node *lh-TailPred;<br />
UBYTE lh-Type;<br />
UBYTE lgad;<br />
>;<br />
struct MinList {<br />
struct MinNode *mlh-Head;<br />
struct MinNode *mlh-Tail;<br />
struct MinNode *mlh-TailPred;<br />
>;<br />
Per comprendere la struttura degli header, consideriamo i<br />
loro primi tre campi e notiamo che i primi due (lh-Head<br />
e lh-Tail; mlh-Head e mlhTai1) coincidono con le prime<br />
due componenti, rispettivamente, di una struct Node e di<br />
una struct MinNode; ciò vale anche, analogamente, per<br />
gli ultimi due (lh-Tail e IhTailPred; mlh-Tail e mlhTai1-<br />
Pred).<br />
In pratica è come se un header fosse formato da due no-<br />
di parzialmente sovrapposti, ovvero con il campo Tail in<br />
comune!<br />
Se immaginiamo di sdoppiare un header in due nodi, du-<br />
plicando il campo Tail, allora possiamo pensare a un<br />
header come a una lista contenente due nodi fittizi, uno<br />
di testa, il cui campo Head punterà al primo elemento<br />
della lista, e uno di coda, il cui campo TailPred punterà<br />
all'ultimo elemento della lista. I1 campo Tail in comune<br />
sarà invece sempre NULL, per indicare che non esiste al-<br />
cun nodo prima del nodo fittizio di testa o dopo il nodo<br />
fittizio di coda; in questo modo è possibile percorrere la