Usando le subroutine per restituire i valori?

5

Attualmente sto imparando FORTRAN (ho familiarità con MatLab) e sono molto confuso riguardo al punto delle subroutine. Perché qualcuno dovrebbe usarli al contrario delle funzioni. Inoltre, come è possibile che possano restituire i valori quando vengono chiamati nei programmi principali? Ad esempio:

PROGRAM SUBDEM 
    REAL A,B,C,SUM,SUMSQ 
    CALL INPUT( + A,B,C)
    CALL CALC(A,B,C,SUM,SUMSQ)
    CALL OUTPUT(SUM,SUMSQ)
END

SUBROUTINE INPUT(X, Y, Z)
    REAL X,Y,Z
    PRINT *,'ENTER THREE NUMBERS => '
    READ *,X,Y,Z
    RETURN
 END

SUBROUTINE CALC(A,B,C, SUM,SUMSQ)
    REAL A,B,C,SUM,SUMSQ
    SUM = A + B + C
    SUMSQ = SUM **2
    RETURN
END

SUBROUTINE OUTPUT(SUM,SUMSQ)
    REAL SUM, SUMSQ
    PRINT *,'The sum of the numbers you entered are: ',SUM
    PRINT *,'And the square of the sum is:',SUMSQ
    RETURN
END

La mia domanda è essenzialmente, come faccio a sapere cosa restituisce ogni subroutine? Grazie.

    
posta user3532764 04.02.2015 - 15:52
fonte

2 risposte

6

In Fortran, una subroutine "restituisce" tutto ciò che gli passi. Puoi pensarlo quasi come una macro C. In questo:

 SUBROUTINE CALC(A,B,C, SUM,SUMSQ)

La subroutine "restituisce" A , B , C , SUM e SUMSQ . (In realtà, modifica solo i valori passati sul posto.)

Al contrario, FUNCTION funziona come una funzione C, creando locals e restituendo un singolo valore, che di solito è quello che le persone usavano per i linguaggi più moderni.

    
risposta data 04.02.2015 - 16:00
fonte
2

Come guida approssimativa, le funzioni sono generalmente utilizzate per racchiudere un piccolo segmento di codice che non ha effetti collaterali. Ad esempio, possiamo scrivere

x = 2*foo(a) + foo(b)/4

se l'ordine di esecuzione non è critico (né a causa di nessun effetto collaterale né gli effetti collaterali non influenzano il risultato). Se il segmento di codice è grande e / o contiene molti effetti collaterali, potrebbe essere preferibile utilizzare una subroutine. Una chiamata di subroutine è sempre un'istruzione separata e quindi l'ordine di esecuzione è sempre univoco.

Una subroutine è come una funzione C con un tipo di ritorno vuoto e con alcuni argomenti passati per riferimento (per impostazione predefinita tutto, in realtà). Ignorando il buono stile e la sicurezza del codice, è in linea di principio possibile utilizzare solo funzioni o solo subroutine quando si scrive Fortran moderno.

    
risposta data 12.04.2015 - 16:52
fonte

Leggi altre domande sui tag