【问题标题】:Fortran Command Line Input In Specification Part规范部分中的 Fortran 命令行输入
【发布时间】:2021-10-30 23:30:03
【问题描述】:

我是 fortran 新手,尝试通过命令行传递参数时遇到问题。例如我的工作代码有以下几行:

!experimental parameters
real (kind=8), parameter :: rhot                =1.2456
!density of top fluid
real (kind=8), parameter :: rhob                = 1.3432
!density of bottom fluid
real (kind=8), parameter :: rhof                = (rhot-rhob)
!generic function of rhot rhob

我想通过:

./fulltime_2009_05_15_Fortran9 [Value rhot] [Value rhob]

使用类似的东西:

call get_command_argument(1,input1)
call get_command_argument(2,input2)
read(input1,*) rhot
read(input2,*) rhob

问题是,我声明像 rhof 这样的参数取决于输入的值。因此,我希望立即应用用户输入的值,以便所有相关参数都可以使用这些值。但是,如果将我的代码修改为:

real (kind=8) :: rhot,  rhoB
call get_command_argument(1,input1)
call get_command_argument(2,input2)
read(input1,*) rhot
read(input2,*) rhob
real (kind=8), parameter :: rhof    = (rhot-rhob)

我收到错误:规范语句不能出现在可执行部分中。

对于我如何解决这个问题有什么想法或建议吗?

【问题讨论】:

  • 如果您是 Fortran 新手,请不要学习 kind=8,请参阅 stackoverflow.com/questions/838310/fortran-90-kind-parameter
  • 为什么需要rhof 成为parameter
  • @VladimirF 我正在修改一个我没有创建的大代码。所以最初的创造者正在使用它,它出现在很多地方。听起来它可能会导致问题,但我害怕从它弹出的 20 多个案例中删除它。你建议我应该这样做吗?
  • @veryreverie 不确定。老实说,我不明白为什么我会将它指定为参数而不是可分配的变量(不确定我说的是否正确)。例如,我不知道为什么我不总是只写:real (kind=8) :: rhof = (rhot-rhob) ?
  • @FluidMan parameter 关键字意味着变量是常量并且在编译时是已知的。参见例如this documentation。如果你想在运行时设置rhof,那么你不想要这个。

标签: fortran initialization user-input


【解决方案1】:

无法通过命令行参数更改编译时间常数 (parameter)。它在编译时修复。

这段代码:

real (kind=8) :: rhot,  rhoB
real (kind=8) :: rhof
call get_command_argument(1,input1)
call get_command_argument(2,input2)
read(input1,*) rhot
read(input2,*) rhob
rhof    = (rhot-rhob)

会编译得很好。但是在普通语句之后不能有变量声明。

你可以有

real (kind=8) :: rhot,  rhoB
call get_command_argument(1,input1)
call get_command_argument(2,input2)
read(input1,*) rhot
read(input2,*) rhob

block
  real (kind=8) :: rhof    = (rhot-rhob)

在 Fortran 2008 中,但不能使用非常量表达式定义编译时常量。

一些编程语言确实允许在运行配置期间设置并在之后固定的常量类型。 Fortran 不是其中之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2011-07-19
    • 2010-09-26
    • 2012-07-04
    • 1970-01-01
    相关资源
    最近更新 更多