我想知道如何在 Fortran 中最好地处理一个接受未知等级参数的子程序。例如:
Real * 8 :: array1(2,2),array2(2,2,3)
call mysubroutine(array1)
call mysubroutine(array2)
至于现在,我总是需要在子程序中修复形状(等级数)。
例如,内在子程序random_number ( array ) 可以做到。(但也许它不是用 Fortran 编码的?)
您必须为每个数组等级编写一个特定的子例程,但是您创建一个通用接口,以便您可以对所有等级使用通用调用,而不必找出要调用的特定子程序。有关于如何为“分配”编写包装器的示例代码
如果您需要按元素填充数组并且这些操作彼此独立,您可以考虑替代MSB 的建议来使用elemental
函数。在这种情况下,您为标量(一个元素)编写函数,它会自动应用于数组的所有元素,而不管数组的形状如何。但是,您的标量函数必须满足对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