为什么我需要在使用它的任何地方声明函数的类型?

时间:2014-05-02 00:36:17

标签: fortran

考虑以下FORTRAN计划:

program functiontest
    implicit none
    real :: x, square
    print *, "Enter a number to square"
    read (*,*) x
    print *, square(x)
end program functiontest


real function square(x)
    real :: x
    square = x * x
end function square

为什么我需要在square内声明realprogram functiontest?我还没有在其定义中将其声明为real function吗?

为什么FORTRAN的作者做出这个设计决定?

4 个答案:

答案 0 :(得分:2)

不,实际上在你的例子中,你还没有在程序中宣称它是real function,但它是程序的外部函数。如果你在程序中定义了你的函数,如下所示,或者将它放在moduleuse d中,你就不必指定它{sa real function两次。

program functiontest
    implicit none
    real :: x
    print *, "Enter a number to square"
    read (*,*) x
    print *, square(x)

contains
    real function square(x)
        real :: x
        square = x * x
    end function square
end program functiontest

至于为什么它也按照您编写的方式工作,它是为了向后兼容Fortran 77.

答案 1 :(得分:1)

将该功能放入模块并使用该模块,如下所示。然后你不需要在主程序中声明该函数。

module foo
contains
real function square(x)
    real :: x
    square = x * x
end function square
end module foo

program functiontest
    use foo
    implicit none
    real :: x
    print *, "Enter a number to square"
    read (*,*) x
    print *, square(x)
end program functiontest

答案 2 :(得分:0)

函数内的 square 是一个变量,而不是函数名。由于它是一个变量,因此必须使用正确的类型进行声明。

答案 3 :(得分:0)

我认为您需要在函数列表中声明类型,因为"通常"编译器不知道" square"的类型。考虑一个你有功能" square"在一个单独的文件中定义,即" square.f"和另一个文件中的函数列表" functionlist.f"。在这种情况下,您需要分别编译每个文件并创建两个目标文件,即square.o和functionlist.o。在这种情况下,编译器不知道" square"类型,在编译" functionlist.o"时,除非您明确定义它。

所以你可能会问为什么编译器需要首先知道square的类型。我认为,答案与内存分配,类型转换有关(例如,当您将结果分配给真实的* 8时),....

请注意,这在C中也很常见。在这里,您需要定义原型(在foo.h中),其中声明了square的类型,或者将所有函数放在一个文件中,以便编译器& #34;看到"广场第一。