2012-01-15 194 views
4
program main 
    real, parameter :: a = 1 
    !real :: a 
    !a=1 

    res = func(a) 
    write(*,*) res 

end program main 

function func(a) 
    real, parameter :: b=a+1 !(*) 
    func = b 
    return 
end function func 

我的編譯器在標有(*)的行上抱怨。有沒有一種方法可以設置一個常量的值,該值的值超出該函數的範圍?用變量的值初始化常量

回答

17

你不能聲明「b」作爲參數,因爲它的值在編譯時不是常量,因爲它取決於函數參數。

這是一個好主意,使用「隱含無」,所以你一定要聲明所有變量。也可以將你的程序放入一個模塊中並「使用」該模塊,以便調用者知道該接口。如在:

module my_funcs 
implicit none 
contains 

function func(a) 
    real :: func 
    real, intent (in) :: a 
    real :: b 
    b = a + 1 
    func = b 
    return 
end function func 

end module my_funcs 

program main 
    use my_funcs 
    implicit none 
    real, parameter :: a = 1 
    real :: res 

    res = func(a) 
    write(*,*) res 

end program main 
8

@M。如果運行時初始化可以接受,那麼S. B.的答案是好的。如果你真的想要一個Fortran parameter,這是設置在編譯的時候,那麼你可以做這樣的:

program main 
    implicit none 
    real, parameter :: a = 1.0 
    real :: res 

    res = func() 
    write(*,*) res 

contains 
    function func() 
    real, parameter :: b = a + 1.0 
    real :: func 
    func = b 
    end function func 
end program main 

我懷疑困惑的部分是由於語言的差異。通常「參數」用於表示函數的參數,但在Fortran中,它永遠不會以這種方式使用。相反,它意味着在C/C++中類似於const。所以,從你的問題來看,我不清楚你是否真的想要Fortran parameter

在我的例子上文中,參數a被內部func經由主機關聯,其是用於嵌套範圍的Fortran行話已知的。你也可以通過使用組合來完成,但它有點更詳細:

module mypars 
    implicit none 
    real, parameter :: a = 1.0 
end module mypars 

module myfuncs 
    implicit none 
contains 
    function func() 
    use mypars, only: a 
    real, parameter :: b = a + 1.0 
    real :: func 
    func = b 
    end function func 
end module myfuncs 

program main 
    use myfuncs, only: func 
    implicit none 
    real :: res 
    res = func() 
    print *, res 
end program main