首页 > 解决方案 > 规范部分中的 Fortran 命令行输入

问题描述

我是 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)

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

关于如何解决这个问题的任何想法或建议?

标签: fortraninitializationuser-input

解决方案


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 不是其中之一。


推荐阅读