2016-12-16 64 views
1

Fortran中是否可以在另一個子例程中定義子例程?當我嘗試類似在另一個子例程中定義子例程

SUBROUTINE test1(...) 
    ! do some stuff 
    CALL test2(...) 

    SUBROUTINE test2(...) 
    ! do some stuff 
    END SUBROUTINE test2 
END SUBROUTINE test1. 

我的編譯器(Silverfrost)給我一個遞歸錯誤。

+0

如果您想在某個特定位置將Fortran作爲標題的一部分,請繼續,但不應使用「Fortran:」。標籤不應該被複制到標題中。 –

+0

@agentp如果你在較大型的工作上,可以考慮使用類似於[tag:intel-fortran]和[tag:nag-fortran]的'silverfrost-fortran'而不是'silverfrost'。 –

+0

@VladimirF同意。有沒有辦法編輯標籤,或者我做一個新的並切換它們? – agentp

回答

3

作爲HighPerformanceMark評論,能夠以限定內部程序在包含另一個程序

SUBROUTINE test1(...) 
    ! do some stuff 
    CALL test2(...) 

CONTAINS 

    SUBROUTINE test2(...) 
    ! do some stuff 
    END SUBROUTINE test2 
END SUBROUTINE test1 

內部程序test2通過主機獲取訪問主機程序test1中定義的所有實體的部分協會。它還可以訪問test1有權訪問的所有實體。這些規則與主程序中的內部程序規則相似。

內部程序無法託管另一個內部程序。

指向內部過程的過程指針僅在執行主機過程期間有效,並且只能在Fortran 2008和更高版本中使用。這是一項高級功能。

該主機關聯有時可以是惱人,你一定要提高警惕,以避免類似的錯誤:

SUBROUTINE test1(...) 
    integer :: i 

    do i = 1, n 
    CALL test2(...) 
    end do 

CONTAINS 

    SUBROUTINE test2(...) 
    do i = 1, n 
     !i here is the same variable as i in test1!! 
    end do 
    END SUBROUTINE test2 
END SUBROUTINE test1 

用Fortran 2015年將有功能更改主機關聯行爲。