Domanda

In Fortran, esiste una chiara differenza tra funzione e subroutine: funzioni restituiscono un valore, subroutine restituiscono alcun valore. Questo introduce una cascata di differenze tra i due. Un esempio è la semantica di chiamata:. Si può chiamare una funzione così come in altre lingue, ma per chiamare una subroutine è necessario rilasciare una dichiarazione call prima

Con l'aggiunta di puntatori e tipi di dati in Fortran95, sembra che non v'è alcuna limitazione tecnica nel fare qualsiasi sottoprogramma una funzione, e mantenendo subroutine solo per l'eredità. Funzioni potrebbero restituire zero (basta restituiscono un intero fittizio), uno o più valori (ad esempio, si potrebbe restituire un puntatore a un'istanza allocato di un tipo, come un C ++ STL coppia).

Mi sbaglio? Abbiamo ancora bisogno subroutine nella programmazione Fortran a causa di qualche caratteristica che subroutine hanno e funzioni non?

È stato utile?

Soluzione

Se la ricerca di archivi comp.lang.fortran, troverete discussioni circa la semantica delle funzioni. IIRC si scopre che non è chiaramente specificato nella norma ciò che è e ciò che non è consentito per le funzioni che hanno effetti collaterali.

Per esempio, in grado di ottimizzare il compilatore

x = foo (args) + Foo (args)

in

x = 2 * foo (args)

O per un altro esempio, si consideri

x = y + foo (y)

Che cosa succede se foo () cambia il valore di y? Ricordate che Fortran non ha il concetto di C di punti di sequenza.

In generale, la raccomandazione da diversi esperti è quello di utilizzare le funzioni solo se sono puri, utilizzare in altro modo le subroutine. E questo è un consiglio che seguo me stesso.

Altri suggerimenti

Non credo subroutine vanno da nessuna parte. La maggior parte delle altre lingue consentono metodi che fanno e non restituiscono valori. Non vedo alcuna ragione per cui questa è una brutta cosa. Nessuno dovrebbe essere spostato per cambiare una cosa.

Legacy da solo dice che subroutine persisteranno finchè fa Fortran. E finché Fortran è in giro, non ci sarà niente di sbagliato con la scrittura di un metodo che esegue un'azione e non restituisce nulla.

UPDATE:

Perché dici "fastidio"? Qual è il problema? Non sono d'accordo con l'idea che subroutine sono una "seccatura" quando sono utilizzati in una situazione adeguata.

Fortran ha mantenuto una distinzione tra funzioni e subroutine a partire dalla versione 77 e probabilmente in precedenza. Altre lingue C-famiglia fanno, anche. Perché questo è un tratto come una seccatura? Anche le lingue che hanno avuto puntatori e oggetti per lungo tempo hanno metodi che restituiscono vuoto.

Si sta tentando di programma C in FORTRAN ancora una volta, non è vero? ; -)

A mio parere, sì - che facciamo. Infatti, se per una sola ragione - sono più facili da afferrare, da capire, e sono più ampiamente usato di funzioni.

Inoltre, -1, perché io credo che questo non è una questione costruttiva. Se non lo fai come loro, allora non usarli.

Se ho capito bene Stefano non è contro l'idea di subroutine. Il parere contro di loro è una sciocchezza. Ha contro l'utilizzo di stili diversi per subroutine / funzioni.

Fortran è il linguaggio di programmazione imperativa. Più precisamente si tratta di un linguaggio di programmazione procedurale (e il linguaggio di programmazione ancora più precisamente si è strutturata).

In programmazione imperativa abbiamo uno Stato e le dichiarazioni di cambiarlo. In programmazione procedurale i nostri strumenti per fare i cambiamenti sono procedure (localizziamo cambiamenti all'interno delle procedure). La procedura può o non può restituire un certo valore. E non credo che questo fatto (o valore restituito dalla procedura o meno) è così ragione significativa per avere 2 entità diverse nel linguaggio di programmazione. Possiamo avere solo funzioni (come in C) e appena di ritorno qualcosa di speciale quando in realtà non hanno bisogno di ritornare qualcosa (void). Oppure possiamo avere solo le procedure e sintassi speciale permettendo di restituire i valori come in Modula-2, Oberon, ...

Il linguaggio probabilmente dovrebbe avere un solo stile di dichiarare procedure. Sono d'accordo con te, Stefano.

Il fatto che devo rispondere io a questa domanda è folle, ma è così che è.

La differenza deriva dal fatto che non si può "funzioni di chiamata come in altre lingue" in Fortran. Mentre in C si può chiamare una funzione integer senza assegnare il valore, ad esempio

int foo() {
    return 5;
}
int main() {
    foo(); // this works
}

In Fortran, si deve sempre associare una variabile di ricezione. Esempio

module test
   implicit none

contains
   integer function foo()
      print *, "hello"
      foo = 0
   end function

end module

program hello
   use test
   integer :: x

   x = foo() ! this works
   foo() ! this does not compile

end program hello

Il che significa che a "emulare" una funzione void restituendo un intero fittizio sarebbe ancora non consentono di chiamare senza avere una variabile ricevente.

In Fortran, il tipo di ritorno void non esiste. Tecnicamente, si potrebbe strutturare il programma con tutte le funzioni, sostituire tutte le occorrenze della dichiarazione call con x = come visto sopra, ma che non sarebbe rendere la vostra sintassi simile a C o altri linguaggi in ogni caso, dove non c'è distinzione tra le funzioni Void-ritorno e non nulle funzioni che ritornano. subroutine sono le uniche entità che consentono di "restituire void", ma la semantica per effettuare la chiamata è semplicemente diverso. A parte questo, non c'è alcuna differenza tra i due.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top