簡體   English   中英

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的聲明,例如 turn

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)

在你的主程序中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM