25.06.2013 Views

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

5.7 Interfacce esplicite ed implicite 239<br />

... ! N.B. nessuna ’’host association’’<br />

END FUNCTION second<br />

Le procedure esterne non possono in alcun caso condividere dati tramite una host association.<br />

<strong>Il</strong> trasferimento dei dati attraverso gli argomenti è il modo più comune di condividere dati con<br />

una procedura esterna. Le procedure esterne possono essere invocate da tutti gli altri tipi di<br />

procedura.<br />

5.7 Interfacce esplicite ed implicite<br />

Una interfaccia ha luogo ogni qualvolta una unità di programma invoca un’altra unità di<br />

programma. Affinché il programma funzioni correttamente è necessario che gli argomenti attuali<br />

dell’unità di programma chiamante siano ”consistenti” con i corrispondenti parametri formali<br />

della procedura chiamata: questa condizione è verificata dal compilatore attraverso un test<br />

sull’interfaccia.<br />

Un problema serio può nascere quando una variabile occupa in una lista di argomenti attuali<br />

il posto che competerebbe ad un array. La procedura invocata non è, generalmente, in grado<br />

di comprendere la differenza tra una variabile scalare ed un array per cui essa tratterà quella<br />

variabile e quelle che seguono in termini di locazioni di memoria come se fossero parte di un<br />

unico array. In questo caso la procedura può modificare perfino il valore di una variabile che<br />

non le è stata passata per riferimento solo perché la sua locazione di memoria segue quella di<br />

un parametro attuale. Problemi come questo sono estremamente difficili da trovare e correggere<br />

quando si lavora con procedure esterne, a meno di non rendere esplicita l’interfaccia, come sarà<br />

chiaro tra breve.<br />

Quando una procedura è compilata all’interno di un modulo e questo modulo è utilizzato<br />

dal programma chiamante, tutti i dettagli dell’interfaccia vengono messi a disposizione del<br />

compilatore. Quando il programma chiamante viene compilato, il compilatore può controllare<br />

automaticamente il numero degli argomenti coinvolti nella chiamata della procedura, il tipo di<br />

ogni argomento, lo scopo (INTENT) di ogni argomento e se gli argomenti sono array. In sintesi, il<br />

compilatore può rilevare molti degli errori tipici che si possono commettere quando si usano delle<br />

procedure. Pertanto, nel caso di procedura compilata all’interno di un modulo e utilizzata con<br />

l’istruzione USE si parla di interfaccia esplicita, in quanto il compilatore conosce esplicitamente<br />

tutti i dettagli su ogni argomento della procedura; tutte le volte che questa procedura viene<br />

utilizzata, il compilatore controlla l’interfaccia per verificare che ogni componente sia utilizzato<br />

in modo appropriato. Anche nel caso di procedure interne tutte queste informazioni sono note<br />

al compilatore per cui, ancora, si parla di interfaccia esplicita: da questo punto di vista questa<br />

situazione non è dissimile dalla chiamata di una procedura intrinseca. Al contrario, nel caso di<br />

procedure esterne non incluse in un modulo si parla di interfaccia implicita: il compilatore non<br />

ha informazioni su queste procedure quando compila l’unità di programma chiamante, quindi<br />

suppone che il programmatore abbia specificato correttamente il numero, il tipo, lo scopo e le<br />

altre caratteristiche degli argomenti delle procedure: in caso di errore il programma si arresta<br />

in modo imprevedibile.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!