[英]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
的第一個錯誤的結果。 整行都無效,因此a
、 b
和c
的類型聲明不會被處理,這會導致編譯器在下次遇到類型時抱怨缺少類型。 一旦您進行了上述建議的修復,這些錯誤就會消失。
如果您的意圖是在主程序中使用名為Area
的變量來存儲模塊函數調用的結果,則可以重命名模塊符號,例如
use triangle_operations, triangleArea => Area
然后這樣做:
real a, b, c, Area
Area = triangleArea(a,b,c)
在你的主程序中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.