Successivo: , Su: Manipolazione di vettori   [Contenuti][Indice]


17.4.11.1 Tipi di dati per i vettori

I tipi di dato associati con i vettori sono i seguenti:

typedef void *awk_array_t;

Se si richiede il valore di una variabile contenuta in un vettore, si ottiene un valore del tipo awk_array_t. Questo valore è opaco114 per l’estensione; identifica in maniera univoca il vettore ma può solo essere usato come parametro di una funzione dell’API, o essere ricevuto da una funzione dell’API. Questo è molto simile al modo in cui i valori ‘FILE *’ sono usati con le routine di libreria di <stdio.h>.

typedef struct awk_element {
    /* puntatore di servizio
     a lista collegata, non usato da gawk */
    struct awk_element *next;
    enum {
        AWK_ELEMENT_DEFAULT = 0,  /* impostato da gawk */
        AWK_ELEMENT_DELETE = 1    /* impostato dall'estensione */
    } flags;
    awk_value_t index;
    awk_value_t value;
} awk_element_t;

awk_element_t è un elemento di vettore “appiattito”. awk produce un vettore di questo tipo all’interno della struttura awk_flat_array_t (si veda poco più avanti). Singoli elementi di vettore possono essere marcati per essere cancellati. Nuovi elementi del vettore devono essere aggiunti individualmente, uno per volta, usando una funzione API apposita. I campi sono i seguenti:

struct awk_element *next;

Questo puntatore è presente come ausilio a chi scrive un’estensione. Permette a un’estensione di creare una lista collegata (linked list) di nuovi elementi che possono essere aggiunti a un vettore con un singolo ciclo che percorre tutta la lista.

enum { … } flags;

Un insieme di valori di flag che passano informazione tra l’estensione e gawk. Per ora c’è solo un flag disponibile: AWK_ELEMENT_DELETE. Se lo si imposta, gawk elimina l’elemento in questione dal vettore originale, dopo che il vettore “appiattito” è stato rilasciato.

index
value

L’indice e il valore di un elemento, rispettivamente. Tutta la memoria puntata da index e valore appartiene a gawk.

typedef struct awk_flat_array {
    awk_const void *awk_const opaque1;    /* per uso di gawk */
    awk_const void *awk_const opaque2;    /* per uso di gawk */
    awk_const size_t count;     /* quanti elementi nel vettore */
    awk_element_t elements[1];  /* saranno ``appiattiti'' */
} awk_flat_array_t;

Questo è un vettore appiattito. Quando un’estensione ottiene da gawk questa struttura, il vettore elements ha una dimensione reale di count elementi. I puntatori opaque1 e opaque2 sono per uso di gawk; come tali, sono marcati come awk_const in modo che l’estensione non possa modificarli.


Note a piè di pagina

(114)

È anche un “cookie,” ma gli sviluppatori di gawk hanno preferito non abusare di questo termine.


Successivo: , Su: Manipolazione di vettori   [Contenuti][Indice]