使用 Intent(in) 参数初始化 Fortran 参数

2 arrays fortran initialization parameter-passing

考虑以下程序:

\n\n
Subroutine foo(p,v)\n  implicit none\n  integer,                         intent(in)  :: p\n  double precision,  dimension(p), intent(in)  :: v \n\n  !local variables\n  integer,parameter :: n=floor(par(p))\n  double precision  :: z(2*n)\n\n[...]\nEnd Subroutine\n
Run Code Online (Sandbox Code Playgroud)\n\n

我收到以下错误:

\n\n
Error: Array \xe2\x80\x98v\xe2\x80\x99 at (1) is a variable, which does not reduce to a constant expression\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是非常明确的,但我想知道是否有一种方法可以管理这种情况:intent(in)将子例程的参数分配给参数变量?

\n

Vla*_*r F 5

不,那是不可能的。参数是编译时常量。它的值不能来自任何参数或变量。

也完全不清楚为什么要这样做(请参阅https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。声明数组不需要参数

double precision :: z(2*floor(par(p)))
Run Code Online (Sandbox Code Playgroud)

因为在自动数组中,边界可以是过程参数。

  • 这样做是有原因的:告诉编译器,某些依赖于函数参数的变量一旦设置就不允许修改。这是对编译器的提示,并带来更好的编程实践。毫不奇怪,这[存在于 Ada 中](http://archive.adaic.com/standards/83rat/html/ratl-03-01.html)。 (2认同)