将数组长度传递给函数

Yot*_*tam 2 fortran

如果这是一个微不足道的问题,我很抱歉.我的fortran-fu很穷.

有没有办法在fortran中路径阵列长度?使用common(从我收集的内容相当于global)也是一种选择.我想要的是在主程序中调用带有数组的函数.例如(输入内容,而不是从任何地方复制粘贴)

program prog
integer num
double precision x(num),v
double precision test

....
v=test(x,num)
....


function test(x,num)
double precision test
integer num
double precision x(num)
test=0.0d0
....
return
end
Run Code Online (Sandbox Code Playgroud)

这不会编译,因为num它不是常数.重要的是要知道我传递的数组大小是多少.

编辑:我正在使用f95编译器.

Edit2:我没有运气就尝试过High Performance Mark的解决方案:

  program prog
  integer v
  parameter (v=10)
  double precision x(v),test,k
  k=test(x)
  write (*,*) size(x)
  stop
  end

  function test(x)
  double precision, dimension(:),intent(in) :: x
  double precision test
  write (*,*) size(x)
  test = 0.0d0
  return
  end
Run Code Online (Sandbox Code Playgroud)

输出应该是两行,其中写入10和10.相反,我得到了这个:

/scpc:niels: #$ f95 err.f
/scpc:niels: #$ ./a.out 
           0
          10
/scpc:niels: #$ 
Run Code Online (Sandbox Code Playgroud)

Hig*_*ark 11

Fortran数组'知道'它们有多长,你不应该将数组及其长度作为不同的参数传递.(除非,就是说,你正在使用旧的Fortran代码.)今天你会写这样的东西

function test(arr)
    real, dimension(:), intent(in) :: arr
    ...
    integer :: arrsize
    ...
    arrsize = size(arr)
    ...
Run Code Online (Sandbox Code Playgroud)

如果必须与传递数组大小的旧代码接口,则可以进行这样的调用

  call old_fortran_subr(array, size(array, 1), other_arguments)
Run Code Online (Sandbox Code Playgroud)

哦,在我写作的时候,common在你从头开始编写的任何代码中都没有任何关系,这是70年代及以前的一个(正确的)弃用功能.而是使用模块变量.

  • @Yotam:你的函数中有一个假定形状的数组(`dimension(:)`)伪参数,它需要一个"显式接口".提供此功能的最简单方法是使您的函数成为程序的内部过程,或者是程序中使用的模块的内部过程. (3认同)