Successivo: , Precedente: , Su: Vettori   [Contenuti][Indice]


8.2 Usare numeri per indicizzare i vettori

Un aspetto importante da ricordare riguardo ai vettori è che gli indici dei vettori sono sempre stringhe. Quando un valore numerico è usato come indice, viene convertito in un valore di tipo stringa prima di essere usato per l’indicizzazione (vedi la sezione Conversione di stringhe e numeri). Ciò vuol dire che il valore della variabile predefinita CONVFMT può influire su come un programma ha accesso agli elementi di un vettore. Per esempio:

xyz = 12.153
dati[xyz] = 1
CONVFMT = "%2.2f"
if (xyz in dati)
    printf "%s è in dati\n", xyz
else
    printf "%s non è in dati\n", xyz

Il risultato è ‘12.15 non è in dati’. La prima istruzione dà a xyz un valore numerico. L’assegnamento a dati[xyz] indicizza dati col valore di tipo stringa "12.153" (usando il valore di conversione di default CONVFMT, "%.6g"). Quindi, all’elemento del vettore dati["12.153"] è assegnato il valore uno. Il programma cambia poi il valore di CONVFMT. La verifica ‘(xyz in dati)’ genera un nuovo valore di stringa da xyz — questa volta "12.15" — perché il valore di CONVFMT consente solo due cifre decimali. Questa verifica dà esito negativo, perché "12.15" è diverso da "12.153".

Secondo le regole di conversione (vedi la sezione Conversione di stringhe e numeri), i valori numerici interi vengono convertiti in stringhe sempre come interi, indipendentemente dal valore che potrebbe avere CONVFMT. E infatti il caso seguente produce il risultato atteso:

for (i = 1; i <= maxsub; i++)
    fa qualcosa con vettore[i]

La regola “i valori numerici interi si convertono sempre in stringhe intere” ha un’altra conseguenza per l’indicizzazione dei vettori. Le costanti ottali ed esadecimali (vedi la sezione Numeri ottali ed esadecimali) vengono convertite internamente in numeri, e la loro forma originale non viene più ricordata. Ciò significa, per esempio, che vettore[17], vettore[021] e vettore[0x11] fanno riferimento tutti allo stesso elemento!

Come molte cose in awk, molto spesso le cose funzionano come ci si aspetta. È utile comunque avere una conoscenza precisa delle regole applicate, poiché a volte possono avere effetti difficili da individuare sui programmi.


Successivo: , Precedente: , Su: Vettori   [Contenuti][Indice]