Fortran编译报错 两个主要程序
Fortran compiling error Two main programs
我一直在尝试为 Fortran 编写这个程序,其中气体的压力是使用范德瓦尔斯方程计算的,每次我都放弃了整个代码并重新开始,因为我所做的一切都会得到一个错误,即使我尝试使用其他问题的答案。我是 Fortran 的新手,我知道我的语法可能已经结束了,如果有人能告诉我哪里出错了,我将不胜感激。
!Named program EquationOfState
program EquationOfState
implicit none
real :: pressure
write(*,*) 'pressure of Ideal Gas = '
write(*,*) 'pressure calculated with Van der Waals equation = '
end program EquationOfState
!Prompt user to input values for density == d, and temperature == t
write(*,*) "Enter density of gas"
read(*,*) d
write(*,*) "Enter temperature conditions"
read(*,*) t
write(*,*) "The pressure of the gas is", pressure
function pressure(d, t)
real(kind=4) :: pressure_IdealGas
real, intent(in) :: d, t
real, parameter :: R = 286.9_4
pressure = d * R * t
end function pressure
有这个错误
program EquationOfState
1
HWL_4.f90:14.36:
write(*,*) "Enter density of gas"
2
Error: Two main PROGRAMs at (1) and (2)
你的台词:
!Prompt user to input values for density == d, and temperature == t
write(*,*) "Enter density of gas"
read(*,*) d
write(*,*) "Enter temperature conditions"
read(*,*) t
write(*,*) "The pressure of the gas is", pressure
在任何程序或函数之外。您至少应该将 end program
语句移到这些行后面。
在你这样做之后,你会意识到无法从主程序调用你的函数,因为变量 pressure
隐藏了外部函数 pressure()
。您将不得不重命名其中之一。
此外,你的函数格式不正确,它被命名为 pressure
,但是你在里面声明了一个叫做 pressure_IdealGas
的东西。
所以你可能想要:
function pressure_IdealGas(d, t)
implicit none
real :: pressure_IdealGas
real, intent(in) :: d, t
real, parameter :: R = 286.9_4
pressure_IdealGas = d * R * t
end function pressure_IdealGas
在主程序中你想调用这个函数:
pressure = pressure_IdealGas(d, t)
write(*,*) "The pressure of the gas is", pressure
注意函数中的implicit none
。在那里使用它很重要,因为函数是外部的,程序中的implicit none
不会影响它。
前面应该可以,但是最好不要使用外部函数和外部子程序。在非常简单的程序中,您可以通过将函数放在关键字 contains
和 end program
之间使函数成为内部函数,但在严肃的程序中您希望将它放入模块中:
module gas_functions
implicit none
contains
function pressure_IdealGas(d, t)
real :: pressure_IdealGas
real, intent(in) :: d, t
real, parameter :: R = 286.9_4
pressure_IdealGas = d * R * t
end function pressure_IdealGas
end module
program EquationOfState
use gas functions
implicit none
...
请注意,每个程序一个 implicit none
就足够了。
阅读 Correct use of modules, subroutines and functions in fortran 了解更多。
最后,函数声明中的real(kind=4)
是没有原因的。为了兼容性,如果你在任何地方都只使用 real
,坚持使用它。由于其他原因,硬编码数字 4
不是一个好主意,请参阅 Fortran 90 kind parameter
我一直在尝试为 Fortran 编写这个程序,其中气体的压力是使用范德瓦尔斯方程计算的,每次我都放弃了整个代码并重新开始,因为我所做的一切都会得到一个错误,即使我尝试使用其他问题的答案。我是 Fortran 的新手,我知道我的语法可能已经结束了,如果有人能告诉我哪里出错了,我将不胜感激。
!Named program EquationOfState
program EquationOfState
implicit none
real :: pressure
write(*,*) 'pressure of Ideal Gas = '
write(*,*) 'pressure calculated with Van der Waals equation = '
end program EquationOfState
!Prompt user to input values for density == d, and temperature == t
write(*,*) "Enter density of gas"
read(*,*) d
write(*,*) "Enter temperature conditions"
read(*,*) t
write(*,*) "The pressure of the gas is", pressure
function pressure(d, t)
real(kind=4) :: pressure_IdealGas
real, intent(in) :: d, t
real, parameter :: R = 286.9_4
pressure = d * R * t
end function pressure
有这个错误
program EquationOfState
1
HWL_4.f90:14.36:
write(*,*) "Enter density of gas"
2
Error: Two main PROGRAMs at (1) and (2)
你的台词:
!Prompt user to input values for density == d, and temperature == t
write(*,*) "Enter density of gas"
read(*,*) d
write(*,*) "Enter temperature conditions"
read(*,*) t
write(*,*) "The pressure of the gas is", pressure
在任何程序或函数之外。您至少应该将 end program
语句移到这些行后面。
在你这样做之后,你会意识到无法从主程序调用你的函数,因为变量 pressure
隐藏了外部函数 pressure()
。您将不得不重命名其中之一。
此外,你的函数格式不正确,它被命名为 pressure
,但是你在里面声明了一个叫做 pressure_IdealGas
的东西。
所以你可能想要:
function pressure_IdealGas(d, t)
implicit none
real :: pressure_IdealGas
real, intent(in) :: d, t
real, parameter :: R = 286.9_4
pressure_IdealGas = d * R * t
end function pressure_IdealGas
在主程序中你想调用这个函数:
pressure = pressure_IdealGas(d, t)
write(*,*) "The pressure of the gas is", pressure
注意函数中的implicit none
。在那里使用它很重要,因为函数是外部的,程序中的implicit none
不会影响它。
前面应该可以,但是最好不要使用外部函数和外部子程序。在非常简单的程序中,您可以通过将函数放在关键字 contains
和 end program
之间使函数成为内部函数,但在严肃的程序中您希望将它放入模块中:
module gas_functions
implicit none
contains
function pressure_IdealGas(d, t)
real :: pressure_IdealGas
real, intent(in) :: d, t
real, parameter :: R = 286.9_4
pressure_IdealGas = d * R * t
end function pressure_IdealGas
end module
program EquationOfState
use gas functions
implicit none
...
请注意,每个程序一个 implicit none
就足够了。
阅读 Correct use of modules, subroutines and functions in fortran 了解更多。
最后,函数声明中的real(kind=4)
是没有原因的。为了兼容性,如果你在任何地方都只使用 real
,坚持使用它。由于其他原因,硬编码数字 4
不是一个好主意,请参阅 Fortran 90 kind parameter