2016-12-21 5 views
1

Ich habe ein CERN-Programm, das die Gammafunktion eines komplexen Arguments berechnet, aber ich kann das Programm wegen fehlendem Fortran-Wissen nicht ausführen.Eine Funktionsreferenz ruft ein Unterprogramm auf

Ich habe folgendes Programm:

PROGRAM Console1 
    IMPLICIT REAL *8 (A-H,O-Z) 
    COMPLEX *16 gama,z,w 
    z=cmplx(0,0.707106781186548d0) 
    gama=cgamma(0,z,w) 
END 

SUBROUTINE cgamma(mo, z, w) 
    INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(14, 60) 
    INTEGER, INTENT(IN)  :: mo 
    COMPLEX (dp), INTENT(IN) :: z 
    COMPLEX (dp), INTENT(OUT) :: w 
... the subroutine code here 
END SUBROUTINE cgamma 

und dann Fehler angezeigt

Fehler # 6553: Eine Funktionsreferenz ein Unterprogramm-Unterprogramm aufruft. [CGAMMA]

+0

Was haben Sie? Eine .exe oder .so oder was? – Holmz

+0

Es ist ein .f90 Ich habe das Programm hinzugefügt. –

+0

Verwenden Sie 'IMPLICIT' nicht das' IMPLICIT NONE'. Sehen Sie sich den Unterprogramm-Code an, wie Variablen definiert werden sollten. Du verlangst eine Menge Ärger, indem du 'IMPLICIT REAL' verwendest. –

Antwort

1

Blick auf die Fehlermeldung:

A Funktionsreferenz-Unterprogramm ein Unterprogramm aufruft.

SUBROUTINE cgamma(mo, z, w) 
END SUBROUTINE 

cgamma definiert als (in diesem Fall extern) Subroutine.

Im Programm

gama=cgamma(0,z,w) 

Referenzen cgamma als Funktion (Rückkehr um ein Ergebnis zu gama zugewiesen werden). Dies ist die Inkompatibilität, auf die sich die Fehlermeldung bezieht.

Um dies zu beheben, müssen Sie das Unterprogramm mit einer call-Anweisung referenzieren oder cgamma als eine Funktion ändern und ein entsprechendes Ergebnis zurückgeben.

Angesichts der Gestaltung des Verfahrens (drei Argumente) würde ich erwarten, dass die Funktion beabsichtigt ist.

+0

Danke, ich musste nur schreiben: 'call cgamma' anstelle von ' gama = cgamma'. Danke für Hilfe –

1

technisch ist es kein Programm. Ich werde einen Teil des Dokuments in Ihrem Link weiter unten, beachten Sie die und END SUBROUTINE cgamma als die sehr ersten und sehr letzten Zeilen. Technisch ist diese Datei kein Fortran-Programm, sondern nur eine Subroutine, die Teil eines größeren Programms ist.

SUBROUTINE cgamma(mo, z, w) 

    IMPLICIT NONE 

! variables and code not worth posting to illustrate what is happening 

    60 w = CMPLX(w1, w2, KIND=dp) 
    RETURN 

    70 w = (0.0_dp, 0.0_dp) 
    RETURN 

    CONTAINS 

    FUNCTION rexp(x) RESULT(fn_val) 
!  extra code here, do not need to post it 
     fn_val = -1.0_dp 
     RETURN 
    END FUNCTION rexp 

END SUBROUTINE cgamma 

in Fortran die ersten und letzten Zeilen der Datei würde PROGRAM whatever und END sein.

so müssen Sie entweder das volle Programm zu erhalten und zu verwenden, die dieses Cgamma Unterprogramm aufruft, oder schreiben Sie Ihre eigene Fortran PROGRAM das dann nennt dieses cgamma Unterprogramm.

+0

Danke für den Rat, ich habe es getan –

Verwandte Themen