Successivo: , Precedente: , Su: Chiamata di una funzione   [Contenuti][Indice]


9.2.3.3 Passare parametri di funzione per valore o per riferimento

In awk, quando si definisce una funzione, non c’è modo di dichiarare esplicitamente se gli argomenti sono passati per valore o per riferimento.

Invece, il modo con cui i parametri sono passati è determinato durante l’esecuzione del programma, quando la funzione è chiamata, nel rispetto della regola seguente: se l’argomento è una variabile di tipo vettoriale, questa è passata per riferimento. Altrimenti, l’argomento è passato per valore.

Passare un argomento per valore significa che quando una funzione è chiamata, le viene fornita una copia del valore di quell’argomento. Il chiamante può usare una variabile il cui valore calcolato viene passato come argomento, ma la funzione chiamata non la riconosce come variabile; riconosce solo il valore assunto dall’argomento. Per esempio, scrivendo il seguente codice:

pippo = "pluto"
z = mia_funzione(pippo)

non si deve pensare che l’argomento passato a mia_funzione() sia “la variabile pippo.” Invece, è corretto considerare l’argomento come la stringa il cui valore è "pluto". Se la funzione mia_funzione() altera i valori delle sue variabili locali, ciò non influisce su nessun’altra variabile. Quindi, se mia_funzione() fa questo:

function mia_funzione(stringa)
{
   print stringa
   stringa = "zzz"
   print stringa
}

cambiando così il valore della variabile che è il suo primo argomento, ossia stringa, il valore di pippo per il chiamante non viene modificato. Il ruolo svolto da pippo nella chiamata di mia_funzione() termina quando il suo valore ("pluto") viene calcolato. Se la variabile stringa esiste anche al di fuori di mia_funzione(), il corpo della funzione non può modificare questo valore esterno, perché esso rimane oscurato durante l’esecuzione di mia_funzione() e non può quindi essere visto o modificato.

Tuttavia, quando sono dei vettori a fungere da parametri alle funzioni, questi non vengono copiati. Invece, il vettore stesso è reso disponibile per essere manipolato direttamente dalla funzione. Questo è quel che si dice solitamente una chiamata per riferimento. Le modifiche effettuate su un vettore passato come parametro all’interno del corpo di una funzione sono visibili all’esterno della funzione.

NOTA: Modificare un vettore passato come parametro all’interno di una funzione può essere molto pericoloso se non si sta attenti a quel che si sta facendo. Per esempio:

function cambialo(vettore, ind, nvalore)
{
     vettore[ind] = nvalore
}

BEGIN {
    a[1] = 1; a[2] = 2; a[3] = 3
    cambialo(a, 2, "due")
    printf "a[1] = %s, a[2] = %s, a[3] = %s\n",
            a[1], a[2], a[3]
}

stampa ‘a[1] = 1, a[2] = due, a[3] = 3’, perché cambialo() memorizza "due" nel secondo elemento di a.


Successivo: , Precedente: , Su: Chiamata di una funzione   [Contenuti][Indice]