Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Guida Pascal - Scrivere procedure e funzioni

Guida Pascal

Capitolo 14° - Scrivere procedure e funzioni

<< Precedente Prossimo >>
Può capitare, molte volte, che le semplici funzioni fornite dal compilatore non bastino a raggiungere lo scopo che ci si prefigge. Per questo esistono delle parole riservate che ci permettono di creare procure e funzioni personalizzate. La sintassi è la seguente:

Procedure <nome>(<parametri>:<tipo>;<parametri>:<tipo>;...);
var ...
begin
    ... (*Corpo della procedura*)
end;

Function <nome>(<parametri>:<tipo>;...):<tipo>;
var ...
begin
    ... (*Corpo della funzione*)
    <nome>:=<valore>
    (*Alla fine, la funzione deve assumere un valore*)
end;


Come avete visto, la sintassi non è semplicissima, ma ci farete labitudine. Le parole in grassetto sono sempre obbligatorie, mentre quelle non evidenziate, si possono anche non mettere, a seconda dello scopo finale. Facciamo qualche esempio, per chiarire alcuni dubbi.
La seguente procedura cambia il valore di alcune variabili globali, dichiarate allesterno di essa:

(*...*)
Var a,b,c,d:integer;

Procedure Cambia_Valori;
begin
    a:=b; b:=c; c:=d; d:=a;
end;


Ho messo le istruzioni in fila per mancanza di spazio, ma, volendo, non è assolutamente sbagliato lasciarle in quel modo.
Come avrete visto, la procedura non accetta nessun parametro (vedi parte iniziale), né, tantomeno, sono dichiarate variabili interne (spiegheremo tra poco cosa sono).
Semplicemente scambia i valori delle variabili globali a,b,c e d. Il corpo della procedura (o funzione) è sempre racchiuso tra un begin e un end;.
Vediamo questaltro esempio:

Program potenz;
uses crt;
var c:integer;
    b:byte;
    r:real;

Function Potenza(base:integer;esponente:byte):real;
var i:byte;
    x:real;
begin
    if esponente=0 then
      Potenza:=1
    else
      begin
      x:=1;
      for i:=1 to esponente
        x:=x*base;
      Potenza:=x;
    end;
end;

begin
    clrscr;
    c:=4;
    b:=2;
    r:=Potenza(c,b);
    writeln(c,' elevato alla potenza ',b,' è ',r:5:2);
    (*Colgo l'occasione per dirvi una cosa sui numeri di tipo real:
    tutti i real vengono visualizzati con l'istruzione write o writeln
    in notazione scientifica, che non sempre è utile o bella da vedere,
    perciò si può 'restringere' la loro visualizzazione, specificando
    quante cifre avrà la parte intera e quante la parte decimale. Si pone
    un ':' dopo il nome della variabile seguito dal numero di cifre totali
    poi un altro ':' seguito dal numero di cifre decimali.
    Nel nostro caso, verrà visualizzato un numero di 5 cifre in tutto
    due delle quali sono decimali, ossia dopo il punto.*)
    readln
end.


La funzione dichiarata calcola la potenza n-esima di un numero qualsiasi di tipo integer. Accetta due parametri, base (di tipo integer, per assicurarci che non sia troppo grande) ed esponente (di tipo byte, per minimizzare il rischio di esponenti troppo grandi (fino a 255)).
Se lesponente è uguale a 0, allora il risultato sarà 1 e con la struttura if...then viene evitato un calcolo inutile.
Nella parte tra la dichiarazione della funzione e il corpo della stessa, cè uno spazio dedicato alle variabili interne: esse servono solo ed esclusivamente allinterno della funzione (o procedura) per semplificare il calcolo e non sono accessibili al di fuori di essa, in quanto la memoria loro assegnata viene liberata al termine della funzione.
x viene settata a 1 e il ciclo for...to...do moltiplica ogni volta x per la base, tante volte quanto è il valore dellesponente.
Alla fine, la funzione assume un valore per mezzo delloperatore :=, e questo passaggio, di norma, non si può tralasciare.
In ogni caso, le variabili che sono passate come parametri non vengono in alcun modo modificate dalla procedura/funzione, a meno che il passaggio non avvenga per indirizzo.

Si, ma cosè il passaggio per indirizzo? Tutti i passaggi di parametri che abbiamo visto fino ad adesso avvengono per valore, ossia il parametro assume il valore della variabile, che non viene modificata, poiché tutte le trasformazioni avvengono sul parametro. Se, invece, si vuole modificare una variabile globale tramite una procedura, qualunque sia la variabile indicata come parametro, si usa un passaggio per indirizzo, che viene realizzato mediante, lanteposizione della parola riservata var prima dello stesso:

(*...*)
var f:integer;

Procedure Esempio(x:integer); (*E un passaggio per valore*)
begin
    x:=2; (*Il parametro x viene settato a 2, ma questa istruzione è inutile, poichè alla fine della procedura il parametro viene distrutto*)
end;

Procedure Exempl(var x:integer); (*E un passaggio per indirizzo*) 
begin
    x:=2; (*La variabile passata a Exempl nella parentesi viene modificata, ossia viene copiato nell'indirizzo di memoria di x il valore 2*)
end;

begin
    clrscr;
    f:=7;
    writeln(f); (*Visualizza 7*)
    Esempio(f);
    writeln(f); (*Visualizza 7*)
    Exempl(f);
    writeln(f); (*Visualizza 2*)
    readln
end.

<< Precedente Prossimo >>
A proposito dell'autore

Programmatore e analista .NET 2005/2008/2010 (in particolare C# e VB.NET), anche nell'implementazione Mono per Linux. Conoscenze approfondite di Pascal, PHP, XML, HTML 4.01/5, CSS 2.1/3, Javascript (e jQuery). Conoscenze buone di C, LUA, GML, Ruby, XNA, AJAX e Assembly 68000. Competenze basilari di C++, SQL, Hlsl, Java.