ansi-c:
In questo capitolo inizieremo a descrivere un programma di disegno alquanto rudimentale. Ecco qui un piccolo test rapido per una delle classi che dovremo e vorremo avere:
Probabilmente l'analisi delle espressioni aritmetiche consiste nello stamparle con un numero minimo di parentesi. Di solito non è un'operazione univoca, dipende spesso da chi è responsabile dell'inserimento delle parentesi. Oltre al nome dell'operatore usato per l'output in notazione postfissa, dobbiamo …
Se vogliamo eseguire operazioni aritmetiche, dobbiamo fare in modo che la funzione che si occupa dell'esecuzione restituisca valori double da stampare nella funzione process().
Non abbiamo ancora deciso cosa process() deve fare. Se vogliamo trattare una versione postfissa dell'espressione, dobbiamo aggiungere una stringa carattere alla struct Type per mostrare l'operazione corrente e process() gestirà quindi una singola linea di output indentata da uno stop …
Applicando ciò che abbiamo imparato nei paragrafi precedenti, dobbiamo considerare che non renderemo nota all'esterno la struttura di un nodo. Al contrario, però, dobbiamo inserire alcune dichiarazioni nel file header value.h
Come si analizza un'espressione. Se vogliamo elaborare valori numerici e semplice aritmetica, possiamo estendere le funzioni di riconoscimento e calcolare i risultati non appena riconosciamo gli operatori e gli operandi: sum() si aspetterebbe un risultato di tipo double da ogni …
Ad un alto livello di analisi, le espressioni vengono riconosciute dalla funzione sum() che internamente chiama scan() e restituisce una rappresentazione che può essere analizzata da process() e da delete().
Nel ciclo principale, una volta che una linea di input è stata letta in bug[], viene passata a scan(), che per ogni chiamata inserisce il successivo simbolo di input all'interno della variabile token.
Il dynamic Linkage è di per sè una tecnica di programmazione veramente potente. Piuttosto che scrivere poche funzioni, ognuna con una lunga sequenza di istruzioni nel costrutto switch - cosa che sicuramente permette di gestire una varia casistica - potremmo …
Per illustrare cosa possiamo fare con il costruttore e l'interfaccia del distruttore implementeremo atomi. Un atomo è un unico oggetto striga. Se due atomi contengono le stesse stringhe sono identici.
Implementiamo le stringhe scrivendo i metodi che necessitano di essere inseriti nel descrittore di tipo String. Il dynamic linkage aiuta nell'identificare chiaramente quali funzioni devono essere "scritte" per implementare il nuovo tipo di dato.
Anche se non abbiamo ancora implementato le stringhe, siamo già capaci di leggere un semplice programma di test. String.h definisce il tipo di dato astratto:
La parte critica sta certamente nell'ipotesi che si possa trovare un puntatore al descrittore di tipo *self direttamente al di sotto del puntatore arbitrario self. Per il momento ci limiteremo a vigilare che non vi siano puntatori nulli.
Chi realizza in pratica il cosiddetto messaging? Il costruttore chiamato da new() per allocare una nuova area di memoria non è praticamente inizializzato:
delete() deve essere in grado di localizzare il distruttore senza sapere che tipo di oggetto le è stato passato. Di conseguenza, rivisitando le dichiarazioni fatte nella sezione 2.1 dobbiamo fare in modo che il puntatore usato per localizzare il distruttore …
Supponiamo di implementare un semplice tipo di dato stringa che provvederemo in seguito ad includere in un set. Per una nuova stringa allocheremo un buffer dinamico che ne contenga il testo. Quando la stringa verrà cancellata, dovremo liberare il buffer.
Se un oggetto può appartenere a più set allo stesso tempo, dobbiamo necessariamente disporre di una diversa rappresentazione per i set. Se continuassimo a rappresentare gli oggetti come un numero intero univoco e se impostassimo un tetto al numero di …
Senza modificare l'interfaccia visibile in Set.h possiamo cambiare l'implementazione. Questa volta useremo la memoria dinamica e rappresenteremo set ed oggetti come strutture:
main.c verrà compilato correttamente, ma prima di eseguire un programma, dobbiamo implementare i tipi di dati astratti e il gestore della memoria. Se un oggetto non memorizza alcuna informazione e se ogni oggetto appartiene a più di un set, possiamo …
Se vogliamo raccogliere tutto ciò che interessa in un set, avremo bisogno di un tipo di dato astratto Object descritto nel file header Object.h