Inform e Glulx/Le basi di Inform/Passaggio dei parametri e ritorno dei valori

Wikibooks, manuali e libri di testo liberi.
Indice del libro

Ora che sappiamo cosa sono le variabili, possiamo esaminare il seguente esempio:

! Esempio sul passaggio dei parametri  - versione 1 

Include "Parser"; Include "VerbLib"; Include "Replace";
[ Funz_princip x n; x = 5; ClearScreen(); ! pulisce lo schermo n = Quadrato(x); print "Il quadrato di ", x , " @`e ", n , ".^"; print "^Premi un tasto per uscire^"; KeyCharPrimitive(); ! legge un carattere dalla tastiera ];
[ Quadrato number; return number*number; ];
[ Initialise; Funz_princip(); quit; ! fine del programma ];
Include "ItalianG";

Il primo cambiamento possiamo notarlo subito all’inizio della funzione Funz_princip: gli argomenti questa volta sono due (x e n). Nulla di strano, perché una qualsiasi funzione in Inform può avere un massimo di 15 argomenti, separati tra di loro da almeno uno spazio. Quando poi viene chiamata la funzione Quadrato viene anche passato il valore tra parentesi (detto parametro) contenuto all’interno della variabile x. Ecco in sostanza quello che accade:

  • alla riga n = Quadrato(x); il programma salta alla funzione Quadrato e il valore contenuto nella variabile x (in questo caso 5) viene assegnato alla variabile number (definita nella funzione Quadrato);
  • viene poi eseguita l’elevazione al quadrato e il valore ottenuto (25) viene restituito, mediante l’istruzione return, e assegnato alla variabile n della funzione Funz_princip.

Se qualcuno di voi ha le idee confuse, si concentri su quello che sto per dire adesso: una variabile può essere locale (viene cioè vista solo all’interno della funzione in cui è definita) o globale (viene cioè vista in qualsiasi punto del programma).

Proviamo a riscrivere la funzione Quadrato in questo modo:

[ Quadrato number;
   return x*x; 
];

e compiliamo nuovamente il programma: il file eseguibile non viene creato, perché sono presenti ben due errori, nell’ordine:

  • "No such constant as x" che, tradotto in italiano, significa "Non c’è nessuna variabile denominata x". Questo accade perché la variabile locale x è stata definita nella funzione Funz_princip e appartiene ad essa soltanto. Ecco quindi il motivo per cui ho definito una nuova variabile number all’interno della funzione Quadrato; se non lo avessi fatto, il valore 5 sarebbe andato irrimediabilmente perso nel momento in cui il programma sarebbe passato dalla funzione Funz_princip alla funzione Quadrato.
    Occorre anche notare che se definisco questa funzione nel seguente modo:

    [ Quadrato x;
    return x*x;
    ];


    il programma funziona perfettamente, ed è normale che sia così. Infatti, la variabile x definita all’interno della funzione Quadrato è diversa dalla variabile x definita all’interno della funzione Funz_princip;
  • "Local variable number declared but not used" che, tradotto in italiano, significa "La variabile locale number è stata dichiarata ma non usata". Ecco dunque un’altra regola sacrosanta di questo linguaggio: tutte le variabili da noi dichiarate, devono essere usate. Nella funzione Quadrato viene definita la number, ma al suo posto viene usata la x: ecco il motivo dell’errore.

Qualcuno di voi potrebbe però chiedersi: perché, al posto di usare più variabili locali non ne uso una sola globale? Perché di funzioni in un’avventura testuale ce ne sono moltissime e usare solo delle variabili globali diventa veramente un azzardo: si genera troppa confusione e aumenta il rischio che Inform scambi un valore per un altro. Comunque, a scopo puramente didattico, ecco come usare una variabile globale con l’esempio di prima:

! Esempio sul passaggio dei parametri  - versione 2 

Include "Parser"; Include "VerbLib"; Include "Replace";
Global x;
[ Funz_princip n; x = 5; ClearScreen(); ! pulisce lo schermo n = Quadrato(); print "Il quadrato di ", x , " @`e ", n , ".^"; print "^Premi un tasto per uscire^"; KeyCharPrimitive(); ! legge un carattere dalla tastiera ];
[ Quadrato; return x*x; ];
[ Initialise; Funz_princip(); quit; ! fine del programma ];
Include "ItalianG";

Come potete vedere, la variabile globale x, essendo stata dichiarata al di fuori di una qualsiasi funzione[1], può essere vista, riconosciuta e modificata in qualsiasi punto del programma[2].

Note[modifica]

  1. O di un qualsiasi oggetto, come vedremo meglio nel capitolo 4.
  2. Cliccate qui per scaricare i listati dei due esercizi (i file 3.06_1.inf e 3.06_2.inf).