01.06.2013 Views

1 - Amiga Magazine Online

1 - Amiga Magazine Online

1 - Amiga Magazine Online

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!