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不会影响它。


前面应该可以,但是最好不要使用外部函数和外部子程序。在非常简单的程序中,您可以通过将函数放在关键字 containsend 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