我的 Fortran 95 子例程的参数是一个带有 Inout 意图的假定形状数组:
the_subroutine(my_argument)
real, dimension(:,:), intent(inout) :: my_argument
(...)
在主程序中,我有一个可分配的数组。我分配它并重命名索引。然后我调用子例程并将该(正确分配的)数组传递给子例程:
allocate(the_array( 5:1005 , 5:1005 ))
call the_subroutine(my_argument=the_array)
该子例程执行某些计算并用值填充数组。在子例程结束前的最后一行,我检查一个随机值:
(...)
print*, my_argument(213,126) ! I get 2.873...
end subroutine the_subroutine
然后,在子程序调用后的第一行,我检查该值是否已通过子例程正确传达到外部世界,但事实并非如此:
call the_subroutine(my_argument=the_array)
print*, the_array(213,126) ! I get 3.798... A completely different value.
问题是由于在主程序中重新索引数组而引起的:
allocate(the_array( 5:1005 , 5:1005 ))
其中 max_index - min_index = 1000-1,但子例程在内部“看到”数组,就像我以正常方式声明一样,即:
allocate(the_array( 1:1000, 1:1000))
或者简单地说,分配(the_array( 1000, 1000 ))
因此,内部数组中的元素(213,126)与主程序数组中的元素位于另一个位置。有什么简单的方法可以解决这个问题吗?