fortran中具有未知秩(形状)的子程序参数

fortran中具有未知秩(形状)的子程序参数,fortran,rank,Fortran,Rank,我想知道如何在Fortran中最好地处理接受未知秩参数的子例程。例如: Real * 8 :: array1(2,2),array2(2,2,3) call mysubroutine(array1) call mysubroutine(array2) 至于现在,我总是需要在子例程中修复形状(秩数) 例如,内部子例程随机数(数组)可以执行此操作。(但可能不是用Fortran编写的?您必须为每个数组列组编写一个特定的子例程,但是您创建了一个通用接口,这样您就可以对所有列组使用通用调用,而不必找出

我想知道如何在Fortran中最好地处理接受未知秩参数的子例程。例如:

Real * 8 :: array1(2,2),array2(2,2,3)

call mysubroutine(array1)
call mysubroutine(array2)
至于现在,我总是需要在子例程中修复形状(秩数)


例如,内部子例程随机数(数组)可以执行此操作。(但可能不是用Fortran编写的?

您必须为每个数组列组编写一个特定的子例程,但是您创建了一个通用接口,这样您就可以对所有列组使用通用调用,而不必找出要调用的特定子例程。在

中有示例代码,如果您需要以元素的形式填充数组,并且这些操作彼此独立,则可以考虑使用“<代码>元素< /代码>函数”的替代方案。在本例中,您为标量(一个元素)编写函数,它将自动应用于数组的所有元素,而不管数组的形状如何。但是,标量函数必须满足
elemental
例程上的条件,这基本上意味着不允许产生任何副作用,这将使结果取决于应用于单个数组元素的顺序

下面是一个演示,它将数组的每个元素乘以2:

module testmod
  implicit none

  integer, parameter :: dp = kind(1.0d0)

contains

  elemental subroutine mul2(scalar)
    real(dp), intent(inout) :: scalar

    scalar = scalar * 2.0_dp

  end subroutine mul2

end module testmod


program test
  use testmod
  implicit none

  real(dp) :: a1(5), a2(3,2)

  a1 = 1.0_dp
  a2 = 2.0_dp
  call mul2(a1)
  call mul2(a2)
  print *, a1
  print *, a2

end program test

非常感谢你的简短回答和长答案的链接。这正是我想要的。或者,如果你在元素上应用的任务满足元素的标准,那么使用元素函数(见下文)可能会简单得多。这也是一个非常有趣的解决方案。谢谢我将调查我的子程序是否可以写成基本子程序。