Precedente: Appiattimento di vettori, Su: Manipolazione di vettori [Contenuti][Indice]
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:
gawk
. Solo dopo aver fatto questo è possibile aggiungere elementi
al vettore.
Analogamente, se si installa un nuovo vettore come sottovettore di un vettore già esistente, occorre prima aggiungere il nuovo vettore al suo "genitore" per poter poi aggiungere degli elementi allo stesso.
Quindi, il modo giusto per costruire un vettore è di lavorare “dall’alto
verso il basso”. Creare il vettore, e subito aggiungerlo alla Tabella dei
simboli di gawk
usando sym_update()
, o installarlo come
elemento in un vettore già esistente usando set_array_element()
.
Un esempio di codice è fornito più sotto.
gawk
, dopo aver usato
sym_update()
per definire un vettore
in gawk
, si deve innanzitutto ricuperare il cookie
del vettore dal valore passato a sym_update()
, in questo modo:
awk_value_t val; awk_array_t new_array; new_array = create_array(); val.val_type = AWK_ARRAY; val.array_cookie = new_array; /* aggiunge il vettore alla Tabella dei simboli */ sym_update("array", & val); new_array = val.array_cookie; /* QUESTO È OBBLIGATORIO */
Se si sta installando un vettore come sottovettore, occorre anche
ricuperare il cookie del vettore dopo aver chiamato set_element()
.
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: Appiattimento di vettori, Su: Manipolazione di vettori [Contenuti][Indice]