2012-01-15 9 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"は、関数の引数に依存するため、値がコンパイル時に一定でないため、パラメータとして宣言することはできません。

「暗黙のnone」を使用して、すべての変数を確実に宣言することをお勧めします。また、プロシージャをモジュールに配置し、そのモジュールを「使用」して、インターフェイスが呼び出し元に知られるようにします。次のように:

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。実行時の初期化があなたに受け入れられれば、B. 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は、ネストされたスコープのためのFortran LINGOあるホストアソシエーションを介しfunc内部に知られています。 アソシエーションを使用してモジュールで行うこともできますが、少し冗長です。

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