LE ROUTINE
PROCEDURE
Una subroutine è una parte di programma che
può essere richiamata da un punto qualsiasi del codice. Il salto alle subroutine si
verifica tramite il nome della subroutine stessa. Al termine della subroutine l'esecuzione
ritornerà al ciclo principale. Lo schema seguente chiarirà meglio la situazione:
Come prassi di questo corso segue un esempio chiarificatore!
{$APPTYPE CONSOLE}
Program esempio;
Uses
Forms;
Procedure INVIO;
begin
WriteLn('Premi INVIO per continuare');
ReadLn;
end;
begin
WriteLn('Riga numero uno');
WriteLn('Riga numero due');
WriteLn;
INVIO;
WriteLn('il programma prosegue dopo l''invio');
WriteLn;
WriteLn;
INVIO;
End.
Il programma inizia scrivendo due righe dal corpo principale, quindi l'esecuzione passa
alla subroutine INVIO per poi continuare nel body...
Qui di seguito verrà presentato un esempio un po' più complesso che implementa il
concetto di parametro che sarà meglio introdurre: il parametro consiste in una variabile
passata ad una procedura che sarà elaborata da lei stessa, ad esempio nel vecchissimo
basic msx (da cui provengo) esisteva una funzione input la cui sintassi era come segue:
Input(Stringa, Variabile)
Nell'esempio che segue si ricreerà una routine simile!
{$APPTYPE CONSOLE}
Program esempio;
Uses
Forms;
var K: Integer;
Procedure Input(S: String; var I: Integer);
begin
Write(S);
ReadLn(I);
end;
begin
Input('Inserisci un numero: ', K);
WriteLn(K);
Input('Inserisci un numero: ', K);
WriteLn(K);
Input('Inserisci un numero: ', K);
WriteLn(K);
ReadLn;
End.
I parametri preceduti da Var sono chiamati parametri passati
per indirizzo o parametri- variabile, quelli non preceduti da Var parametri per valore o parametri-valore.
La differenza sta nel fatto che le variabili passate a variabili cambiano anche il valore
della variabile, in altre parole rimuovendo il var dalla procedura input il programma non
funzionerà in quanto la variabile I della procedura input sarà una copia di K e non K
stessa. Ripetendo il concetto le variabili passate per indirizzo diventano a tutti gli
effetti le variabili locali, in breve il parametro passato per indirizzo e la variabile
passata alla procedura sono la stessa cosa, cioè condividono la stessa locazione di
memoria. Di conseguenza ogni modifica del parametro passato per indirizzo è in realtà
una modifica della variabile stessa. Al contrario il parametro S che viene passato per
valore non verrà alterato in alcun modo. Ad esempio provate ad eseguire il seguente
codice:
{$APPTYPE CONSOLE}
Program esempio;
Uses
Forms;
var
K: Integer;
Procedure Prova1(I: Integer);
begin
WriteLn('siamo all''interno di prova1 e la variabile sta per essere impostata a
34');
I:= 34;
end;
Procedure Prova2(var I: Integer);
begin
WriteLn('siamo all''interno di prova2 e la variabile sta per essere impostata a
56');
I:= 56;
end;
begin
K:= 0; WriteLn('K corrisponde a ', K);
WriteLn('ora verrà chiamata la routine prova1');
Prova1(K);
WriteLn('K corrisponde ora a ', K);
WriteLn('infine verrà chiamata la routine prova2');
Prova2(K);
WriteLn('K corrisponde ora a ', K);
ReadLn;
End.
Il risultato dell'esecuzione del codice sarà il seguente
![]() |
K corrisponde a 0 |
![]() |
ora verrà chiamata la routine prova1 |
![]() |
siamo all'interno di prova1 e la variabile sta per essere impostata a 34 |
![]() |
K corrisponde ora a 0 |
![]() |
infine verrà chiamata la routine prova2 |
![]() |
siamo all'interno di prova2 e la variabile sta per essere impostata a 56 |
![]() |
K corrisponde ora a 56 |
Si noti che anche se K viene alterato nella procedura prova1 al ritorno il valore assunto
da esso non sarà cambiato, questo perchè in realtà era stato variato solo il valore di
una copia di K, non K stesso! Spero di essere stato abbastanza chiaro, d'altronde la
programmazione a subroutine (comunemente detta strutturata). Come sempre consiglio di
provare quanto appreso, il prossimo capitolo sarà piuttosto breve in quanto tra poco si
passerà alla programmazione Windows.
Corso interamente creato da VB.