Fortran函数错误与包含范围单元中的名称冲突

时间:2014-10-09 15:37:06

标签: fortran fortran90

我是Fortran的新手。这个简单代码的问题是什么?

program combinatorial
    Implicit none
    integer :: m, n, Fact
    integer :: Com
    Write (*,*) 'inter 2 number for m and n'
    Read (*,*) m,n
    Com = Fact (m)/(Fact(n)*Fact(m-n))

    Contains
    integer Function Fact(t)
        Implicit none
        Integer, intent(IN) :: t
        integer :: i, Ans       
        Ans = 1
        Do i=1, t
            Ans=Ans * i
        End do
        Fact = Ans
    End Function Fact
End program combinatorial

我遇到的错误是:

combinatorial.f90(10): error #6626: The name of the internal procedure conflicts with a name in the encompassing scoping unit.   [FACT]
    integer Function Fact(t)
-------------------------^
compilation aborted for combinatorial.f90 (code 1)

1 个答案:

答案 0 :(得分:5)

由于程序中Factcontain,编译器将自动生成一个接口。通过声明integer名为Fact的{​​{1}}事物,你会给编译器提供相互矛盾的说明,而且不是那样的。只需从行

中删除Fact即可
integer :: m, n, Fact

编译器引用的encompassing scoping unit是包含(或包含)函数的程序。

另外,您不需要在函数定义中使用变量Ans。你可以简单地写一下

integer Function Fact(t)
    Implicit none
    Integer, intent(IN) :: t
    integer :: i       
    Fact = 1
    Do i=1, t
        Fact = Fact * i
    End do
End Function Fact

除非在result语句中使用function子句,否则编译器的行为就像它创建一个与返回函数结果的函数同名的变量。