我在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
会出现错误?我已明确将这些定义为实数。
答案 0 :(得分:1)
问题是你已经定义了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)
在您的主程序中。