考虑以下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
内声明real
为program functiontest
?我还没有在其定义中将其声明为real function
吗?
为什么FORTRAN的作者做出这个设计决定?
答案 0 :(得分:2)
不,实际上在你的例子中,你还没有在程序中宣称它是real function
,但它是程序的外部函数。如果你在程序中定义了你的函数,如下所示,或者将它放在module
和use
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;看到"广场第一。