2014-04-22 59 views
0

我有一個示例代碼測試我用Fortran 90超載子程序理解這是我的例子:Fortran的未解決的模塊程序規範名稱

module testint_mod 
    use constants 
    implicit none 

    private :: testvReal 
    private :: testvdpn 

    interface testv 
    module procedure testvReal 
    module procedure testvdpn 
    end interface 
    contains 

    subroutine testvReal(vR) 
    implicit none 
    real,intent(in) :: vR 
    write(*,*) vR 
    end subroutine 

    subroutine testvdpn(vdpn) 
    implicit none 
    real(kind=dpn),intent(in) :: vdpn 
    write(*,*) vdpn 
    end subroutine 

    end module testint_mod 


    program testintmain 
    use constants 
    use testint_mod 
    implicit none 
    real :: r 
    real(kind=dpn) :: d 
    integer :: i 

    interface testv 
    module procedure testvdpn 
    end interface 

    r = 2.0 
    d = dble(4.0) 
    call testv(r) 
    call testv(d) 

    end program testintmain 

其中常量包括:整數,參數DPN = selected_real_kind(14)

我得到的錯誤:

testint_main.F(10) : Error: Unresolved MODULE PROCEDURE specification name. [T 
    ESTVDPN] 
      module procedure testvdpn 
    -------------------------^ 

我在做什麼錯?是否不允許使用selected_real_kind()重載函數?我感謝任何幫助!

回答

1

interface testv主程序的規範是有問題的:編譯器抱怨testvdpn不能在主程序來解決 - 也的確是沒什麼用這個名字公開訪問。此外,testv已經可以通過使用它定義的模塊testint_mod的關聯來訪問。這三行應該刪除。

爲了回答後問的問題

Is overloading a function with selected_real_kind() not allowed?

如果一套通用的兩個過程是由一個真正的參數的種類參數來分辨,那麼也不要緊應一個(或多個)來從selected_real_kind結果。但是,應該注意的是種類參數真的很明顯。例如,該示例的selected_real_kind(14)可能會返回與默認實數相同的種類。這和類似的情況是不允許的。雖然編譯器肯定會呻吟。

還要注意,爲了完整性,對於功能(而非子程序的問題)消歧必須由職能的論點,而不是結果只。

+0

啊,當然,我忘了通過使用聲明的訪問。現在好像工作正常,謝謝! – Charlie

+0

不,函數結果的類型在通用分辨率中不起作用!只有論據是重要的。 –

+0

@VladimirF上下文應該是結果沒有考慮,但我希望澄清,現在的答案。 – francescalus

相關問題