gfortran没有编译实变量

时间:2015-06-10 23:20:06

标签: fortran gfortran

我在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会出现错误?我已明确将这些定义为实数。

1 个答案:

答案 0 :(得分:1)

问题是你已经定义了Area两次 - 一次在主程序中,一次在你导入的模块中,名称冲突。您可能认为在调用没有显式接口的函数时,需要在主程序中将Area定义为从较早(较暗)时间的保留。在现代Fortran中,模块自动提供接口,语句use Triangle_operations就足够了。

要解决您的问题,请从主程序中移除Area的延期,例如转

REAL :: a, b, c, Area

REAL :: a, b, c

编译输出中的后续错误是与Area有关的第一个错误的结果。整个行都会失效,因此abc的类型声明不会被处理,这会导致编译器在下次遇到丢失类型时抱怨它们。一旦你做出上面建议的修复,这些错误就会消失。

如果你的意图是在主程序中有一个名为Area的变量来存储模块函数调用的结果,你可以重命名模块符号,例如

use triangle_operations, triangleArea => Area

然后执行此操作:

real a, b, c, Area
Area = triangleArea(a,b,c)

在您的主程序中。