gfortran 不编译真正的变量
gfortran doesn't compile real variables
我用Fortran90写了一个简单的程序来计算三角形的面积。用户输入三角形的三边,然后程序输出面积。很简单。
MODULE Triangle_Operations
IMPLICIT NONE
CONTAINS
FUNCTION Area(x,y,z)
REAL :: Area ! function type
REAL, INTENT( IN ) :: x, y, z
REAL :: theta, height
theta = ACOS((x**2+y**2-z**2)/(2.0*x*y))
height = x*SIN(theta); Area = 0.5*y*height
END FUNCTION Area
END MODULE Triangle_Operations
PROGRAM Triangle
USE Triangle_Operations
IMPLICIT NONE
REAL :: a, b, c, Area
PRINT *, 'Welcome, please enter the &
&lengths of the 3 sides.'
READ *, a, b, c
PRINT *, 'Triangle''s area: ', Area(a,b,c)
END PROGRAM Triangle
当我用 gfortran
gfortran triangle1.f90
编译时,这是我收到的错误:
triangle1.f90:16.25:
REAL :: a, b, c, Area
1
triangle1.f90:14.8:
USE Triangle_Operations
2
Error: Symbol 'area' at (1) conflicts with symbol from module 'triangle_operations', use-associated at (2)
triangle1.f90:19.13:
READ *, a, b, c
1
Error: Symbol 'a' at (1) has no IMPLICIT type
triangle1.f90:19.16:
READ *, a, b, c
1
Error: Symbol 'b' at (1) has no IMPLICIT type
triangle1.f90:19.19:
READ *, a, b, c
1
Error: Symbol 'c' at (1) has no IMPLICIT type
为什么变量 a,b,c
会抛出错误?我已将这些明确定义为实数。
问题是您定义了 Area
两次——一次在您的主程序中,一次在您导入的模块中,并且名称冲突。您可能认为您需要在主程序中定义 Area
作为在没有显式接口的情况下调用函数时较早(较暗)时间的保留。在现代 Fortran 中,模块自动提供接口,语句 use Triangle_operations
就足够了。
要解决您的问题,请从您的主程序中删除 Area
的声明,例如转
REAL :: a, b, c, Area
进入
REAL :: a, b, c
编译输出中的后续错误是有关 Area
的第一个错误的结果。整行都无效,因此 a
、b
和 c
的类型声明不会被处理,这会导致编译器在下次遇到类型时抱怨缺少类型。一旦您按照上述建议进行修复,这些错误就会消失。
如果您的意图是在主程序中有一个名为 Area
的变量来存储模块函数调用的结果,您可以重命名模块符号,例如
use triangle_operations, triangleArea => Area
然后这样做:
real a, b, c, Area
Area = triangleArea(a,b,c)
在你的主程序中。
我用Fortran90写了一个简单的程序来计算三角形的面积。用户输入三角形的三边,然后程序输出面积。很简单。
MODULE Triangle_Operations
IMPLICIT NONE
CONTAINS
FUNCTION Area(x,y,z)
REAL :: Area ! function type
REAL, INTENT( IN ) :: x, y, z
REAL :: theta, height
theta = ACOS((x**2+y**2-z**2)/(2.0*x*y))
height = x*SIN(theta); Area = 0.5*y*height
END FUNCTION Area
END MODULE Triangle_Operations
PROGRAM Triangle
USE Triangle_Operations
IMPLICIT NONE
REAL :: a, b, c, Area
PRINT *, 'Welcome, please enter the &
&lengths of the 3 sides.'
READ *, a, b, c
PRINT *, 'Triangle''s area: ', Area(a,b,c)
END PROGRAM Triangle
当我用 gfortran
gfortran triangle1.f90
编译时,这是我收到的错误:
triangle1.f90:16.25:
REAL :: a, b, c, Area
1
triangle1.f90:14.8:
USE Triangle_Operations
2
Error: Symbol 'area' at (1) conflicts with symbol from module 'triangle_operations', use-associated at (2)
triangle1.f90:19.13:
READ *, a, b, c
1
Error: Symbol 'a' at (1) has no IMPLICIT type
triangle1.f90:19.16:
READ *, a, b, c
1
Error: Symbol 'b' at (1) has no IMPLICIT type
triangle1.f90:19.19:
READ *, a, b, c
1
Error: Symbol 'c' at (1) has no IMPLICIT type
为什么变量 a,b,c
会抛出错误?我已将这些明确定义为实数。
问题是您定义了 Area
两次——一次在您的主程序中,一次在您导入的模块中,并且名称冲突。您可能认为您需要在主程序中定义 Area
作为在没有显式接口的情况下调用函数时较早(较暗)时间的保留。在现代 Fortran 中,模块自动提供接口,语句 use Triangle_operations
就足够了。
要解决您的问题,请从您的主程序中删除 Area
的声明,例如转
REAL :: a, b, c, Area
进入
REAL :: a, b, c
编译输出中的后续错误是有关 Area
的第一个错误的结果。整行都无效,因此 a
、b
和 c
的类型声明不会被处理,这会导致编译器在下次遇到类型时抱怨缺少类型。一旦您按照上述建议进行修复,这些错误就会消失。
如果您的意图是在主程序中有一个名为 Area
的变量来存储模块函数调用的结果,您可以重命名模块符号,例如
use triangle_operations, triangleArea => Area
然后这样做:
real a, b, c, Area
Area = triangleArea(a,b,c)
在你的主程序中。