2010-09-30 7 views
18

Es ist mein Verständnis, dass Sie ein Array von einer Funktion in Fortran zurückgeben können, aber aus irgendeinem Grund gibt mein Code nur den ersten Wert in dem Array zurück, das ich es zurückgeben möchte. Dies ist die Funktion:Funktion Zurückgeben eines Arrays 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 

und das ist, wo ich es nennen bin

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

print *, C(1:numPoints)` 

jetzt ist es nicht etwas Nützliches tun, weil ich versuche, die Syntax zu verstehen, bevor ich die Logik schreiben . Ich sah ein paar Sachen über die Angabe von Typen für Funktionen, aber wenn ich schreibe

oder was auch immer ich bekomme einen Kompilierungsfehler.

Antwort

25

eine Funktion zu definieren, die ein Array zurückgibt umfassen die Funktionsdeklaration innerhalb der Funktion, wie folgt aus:

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 

Ihre Erklärung

integer function polynomialMult(npts,x,y) 

erklärt, daß die Funktion eine ganze Zahl zurückgibt. Eine ganze Zahl, kein Array von ganzen Zahlen. Ich glaube nicht, dass der Standard Funktionsdeklarationen wie zum Beispiel:

erlaubt, aber ich könnte falsch liegen. Ich benutze immer das Formular, das ich dir oben gezeigt habe.

Wenn Sie einen aktuellen Fortran-Compiler haben, können Sie clevere Dinge tun, z. B. ein zugewiesenes Array zurückgeben. Und ich schlage vor, dass Sie Array-Syntax herausfinden. Zum Beispiel Ihre Aussage:

polynomialMult = x(1:npts) + 1 

prägnanter geschrieben werden könnte:

polynomialMult = x + 1 

da Fortran die skalare zusätzlich zu allen Elementen des Arrays x, die Sie erklärt haben, nur npts Elemente haben abzubilden.

Die Größe von Arrays in Subroutinen zu übergeben ist sehr FORTRAN77 und fast immer unnötig. Im Allgemeinen möchten Sie entweder auf jedes Element in einem Array (wie im Beispiel der Arraysyntax) zugreifen oder das Subprogramm die Größe des Arrays ermitteln lassen, mit dem es zu tun hat.

+1

Danke für Ihre Hilfe. Wie du wahrscheinlich weißt, bin ich neu in Fortran. – Statler

3

ich mit dem bisherigen Responder einig, dass die folgenden Werke:

polynomialMult = x + 1 

jedoch ohne zu wissen, dass polynomialMult und x-Arrays sind, könnte man annehmen, dass es eine skalare Operation ist. Ich bevorzuge es offensichtlich zu sein und tun es auf diese Weise:

polynomialMult(:) = x(:) + 1 

ich sogar darauf bestanden haben, dass die Programmierer in meiner Gruppe es auf diese Weise tun. Ich mag es nicht, hart zu arbeiten, um jemandes Code zu verstehen - ich möchte, dass es offensichtlich ist, was sie tun.

+2

Haha, kehrte zu dieser Frage zurück, als es wieder eine Stimme bekam.Es gibt ein subtiles "Problem" mit dieser Antwort: 'polynomialMult' ist ein Array und' polynomialMult (:) 'ist ein Array-Abschnitt und die beiden sind nicht immer austauschbar, obwohl sie hier sind. –

+0

@HighPerformanceMark: Ich würde etwas wie "polynomialMult (1: npts) = x (1: npts) + 1" sagen. Dann besteht kein Zweifel, richtig? – jvriesem

+1

@jvriesem, hängt davon ab, wie die Indizes von 'polynomialMult' gesetzt sind. Manchmal gibt es gute Gründe, nicht-standardisierte Indizes wie 'double precision polynomialMult (0: npts-1)' 'zu verwenden. In diesem Fall riskieren Sie Fehler mit "polynomialMult (0: npts-1) = x (0: npts-1) + 1", da Sie die Indizes im Ausdruck versehentlich vertippen könnten. – astay13