在我写的并行程序中,我定义了很多多维 allocatable
数组(实际上只有1D,2D或3D),它们在执行期间分配了 negative lower bounds . 我这样做的原因是每个进程在一个2D示例中处理一个14×14 A
矩阵并与四个相邻进程共享2层的重叠,因此矩阵分配有边界 (-1:12,-1:12)
,其中"internal"部分矩阵对应于1到10的索引 . (斜体表示选择/输入依赖性) .
问题是,在这样做时我没有意识到依靠this Fortran2003 feature是不可能的,因此在调用单元中不可能 call mysub(A(:,i),...)
并且在子程序中使用实际边界引用 A
的虚拟对应物(-1)和12),因为 A(:,i)
是一个表达式,而不仅仅是一个变量 .
如果我将整个数组 A
传递给子程序,问题就解决了,正如previous linked answer中所解释的那样,但是这会迫使我写一个"bigger"而不那么通用的子程序,相反,它是用于一维子阵列的 .
是否有可能以子程序知道实际变量边界的方式将 allocatable
数组的子数组(例如 A(:,1)
)传递给子程序?
1 回答
据我所知:不,这是不可能的 .
请注意,通常,您不想关心子例程中数组的实际下限 . 如果你有一个对一个数组或类似的数组求和的子程序,你只想从1循环到数组的大小 . 并且您希望能够将任何数组传递给此类子例程 .
如果需要从子例程中的特定索引开始,则可以始终使用
1.将下限声明为魔术常量
也许不太好,但我在我的主要 生产环境 代码中使用它,因为我几年前就这样开始了 .
2.将下限声明为模块中的常量并使用它
3.将下限作为伪参数传递