2010-09-30 5 views
18

È a mia conoscenza che è possibile restituire un array da una funzione in Fortran, ma per qualche motivo il mio codice restituisce solo il primo valore dell'array che gli sto chiedendo di restituire. Questa è la funzione:Funzione Restituzione di un array in Fortran

function polynomialMult(npts,x,y) 
    integer npts 
    double precision x(npts), results(npts + 1), y(npts,npts) 

    polynomialMult = x(1:npts) + 1 

end function 

e questo è dove sto chiamando

C(1:numPoints) = polynomialMult(numPoints,x,f) 

print *, C(1:numPoints)` 

in questo momento non fa nulla di utile perché sto cercando di capire la sintassi prima di scrivere la logica . Ho visto alcune cose su come specificare i tipi di funzioni, ma quando scrivo

integer function polynomialMult(npts,x,y) 

o qualsiasi altra cosa ottengo un errore di compilazione.

risposta

25

Per definire una funzione che restituisce un array includono la dichiarazione di funzione all'interno della funzione, in questo modo:

function polynomialMult(npts,x,y) 
    integer npts 
    double precision x(npts), results(npts + 1), y(npts,npts) 

! Change the next line to whatever you want 
    double precision, dimension(npts) :: polynomialMult 

    polynomialMult = x(1:npts) + 1 

end function 

vostra dichiarazione

integer function polynomialMult(npts,x,y) 

dichiara che la funzione restituisce un intero. Un numero intero, non un array di numeri interi. Non credo che lo standard permetta dichiarazioni di funzioni come:

integer, dimension(10) function polynomialMult(npts,x,y) 

ma potrei sbagliarmi. Uso sempre il modulo che ti ho mostrato sopra.

Se si dispone di un compilatore Fortran aggiornato, è possibile eseguire operazioni intelligenti come restituire un array assegnato. E ti suggerisco di capire la sintassi dell'array. Ad esempio, la sua dichiarazione: potrebbe più conciso essere scritto

polynomialMult = x(1:npts) + 1 

:

polynomialMult = x + 1 

dal Fortran mapperà l'aggiunta scalare a tutti gli elementi della matrice x che avete dichiarato di avere solo npts elementi.

Il passaggio delle dimensioni degli array nelle subroutine è molto FORTRAN77 e quasi sempre non necessario ora. In genere si desidera operare su ogni elemento di un array (come nell'esempio di sintassi dell'array) o lasciare che il sottoprogramma calcoli la dimensione dell'array con cui sta trattando.

+1

Grazie per il vostro aiuto. Come probabilmente puoi dire, sono nuovo di Fortran. – Statler

3

Sono d'accordo con il risponditore precedente che ha le seguenti opere:

polynomialMult = x + 1 

Tuttavia, senza sapere che polynomialMult e x sono array, si potrebbe supporre che è un'operazione scalare. Preferisco essere ovvio e fare in questo modo:

polynomialMult(:) = x(:) + 1 

ho anche insistito sul fatto che i programmatori del mio gruppo farlo in questo modo. Non mi piace lavorare sodo per capire il codice di qualcuno - voglio che sia ovvio cosa stanno facendo.

+2

Haha, restituito a questa domanda quando ha ottenuto un altro voto.C'è un 'problema' sottile con questa risposta: 'polynomialMult' è un array e' polynomialMult (:) 'è una sezione array e le due non sono sempre intercambiabili, sebbene siano qui. –

+0

@HighPerformanceMark: Direi qualcosa come 'polynomialMult (1: npts) = x (1: npts) + 1'. Quindi non c'è dubbio, giusto? – jvriesem

+1

@jvriesem, dipende da come sono impostati gli indici di 'polynomialMult'. A volte ci sono buone ragioni per usare indici non standard come 'double precision polynomialMult (0: npts-1)'. In tal caso si rischiano errori con 'polynomialMult (0: npts-1) = x (0: npts-1) + 1' poiché si potrebbe digitare erroneamente gli indici nell'espressione. – astay13