2016-12-21 40 views
1

我有CERN程序計算複雜參數的伽瑪函數,但由於缺乏Fortran知識,我無法運行該程序。函數引用正在調用一個子程序

我有以下程序:

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 

然後錯誤出現

錯誤#6553:函數參照正在調用的子程序的子程序。 [CGAMMA]

+0

你有什麼?一個.exe或.so或什麼? – Holmz

+0

這是一個.f90我添加了程序。 –

+0

請勿使用'IMPLICIT'其他'IMPLICIT NONE'。查看應該如何定義變量的子程序代碼。你正在使用'IMPLICIT REAL'來要求很多麻煩。 –

回答

1

查看錯誤消息:

函數引用被調用的子程序的子程序。

SUBROUTINE cgamma(mo, z, w) 
END SUBROUTINE 

限定cgamma作爲(在這種情況下,外部的)子程序。

在程序

gama=cgamma(0,z,w) 

引用cgamma作爲函數(返回到被分配給gama的結果)。這是錯誤消息所指的不兼容性。

要解決此問題,您需要使用call語句引用子例程,或將cgamma更改爲函數,並返回適當的結果。

鑑於該過程的設計(三個參數),我期望函數的目的。

+0

謝謝,我只需要寫: 'call cgamma' 而不是 'gama = cgamma'。 感謝您的幫助 –

1

從技術上講,這不是一個程序。 我將在下面的鏈接中重新部署文檔的一部分,請注意SUBROUTINE cgammaEND SUBROUTINE cgamma爲非常第一個和非常最後行。從技術上講,這個文件不是一個fortran程序,它只是一個子程序,它是大型程序的一部分。

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 

在FORTRAN文件的第一個和最後一個行會PROGRAM whateverEND

所以你需要獲得完整的程序並使用那個調用這個cgamma子程序的函數,或者編寫你自己的fortran PROGRAM然後調用這個cgamma子例程。

+0

感謝您的建議,我做到了 –

相關問題