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


17.4.11.4 Come creare e popolare vettori

Oltre a lavorare con vettori creati da codice awk, si possono creare vettori a cui aggiungere elementi secondo le esigenze, che poi il codice awk può utilizzare e manipolare.

Ci sono due punti importanti da tener presente quando di creano vettori dal codice di un’estensione:

Il seguente codice C è una semplice estensione di test per creare un vettore con due elementi normali e con un sottovettore. Le direttive iniziali #include e le solite dichiarazione di variabili sono state omesse per amor di brevità (vedi la sezione Codice predefinito di interfaccia API). Il primo passo è creare un nuovo vettore e poi aggiungerlo alla Tabella dei simboli:

/* create_new_array --- creare un vettore denominato */

static void
create_new_array()
{
    awk_array_t a_cookie;
    awk_array_t sottovettore;
    awk_value_t index, valore;

    a_cookie = create_array();
    valore.val_type = AWK_array;
    valore.array_cookie = a_cookie;

    if (! sym_update("new_array", & value))
        printf("create_new_array: sym_update(\"nuovo_vettore\") \
non riuscito!\n");
    a_cookie = valore.array_cookie;

Si noti come a_cookie è reimpostato dal campo array_cookie nella struttura valore.

Il secondo passo aggiunge due elementi normali a nuovo_vettore:

    (void) make_const_string("salve", 5, & index);
    (void) make_const_string("mondo", 5, & value);
    if (! set_array_element(a_cookie, & index, & value)) {
        printf("fill_in_array: set_array_element non riuscito\n");
        return;
    }

    (void) make_const_string("risposta", 8, & index);
    (void) make_number(42.0, & value);
    if (! set_array_element(a_cookie, & index, & value)) {
        printf("fill_in_array: set_array_element non riuscito\n");
        return;
    }

Il terzo passo è creare il sottovettore e aggiungerlo al vettore:

    (void) make_const_string("sottovettore", 12, & index);
    sottovettore = create_array();
    valore.val_type = AWK_array;
    valore.array_cookie = subarray;
    if (! set_array_element(a_cookie, & index, & value)) {
        printf("fill_in_array: set_array_element non riuscito\n");
        return;
    }
    sottovettore = valore.array_cookie;

Il passo finale è di aggiungere al sottovettore un suo proprio elemento:

    (void) make_const_string("pippo", 5, & index);
    (void) make_const_string("pluto", 5, & value);
    if (! set_array_element(sottovettore, & index, & value)) {
        printf("fill_in_array: set_array_element non riuscito\n");
        return;
    }
}

Ecco uno script di esempio che carica l’estensione e quindi stampa il valore di tutti gli elementi del vettore, invocando nuovamente se stessa nel caso che un particolare elemento sia a sua volta un vettore:

@load "subarray"

function dumparray(nome, vettore,     i)
{
    for (i in vettore)
        if (isarray(vettore[i]))
            dumparray(nome "[\"" i "\"]", vettore[i])
        else
            printf("%s[\"%s\"] = %s\n", nome, i, vettore[i])
}

BEGIN {
    dumparray("new_array", new_array);
}

Ecco il risultato dell’esecuzione dello script:

$ AWKLIBPATH=$PWD gawk -f subarray.awk
-| new_array["sottovettore"]["pippo"] = pluto
-| new_array["salve"] = mondo
-| new_array["risposta"] = 42

(Vedi la sezione Come gawk trova le estensioni compilate per ulteriori dettagli sulla variabile d’ambiente AWKLIBPATH.)


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