本文中对数组的所有引用都是多维的。
我开始知道当一个数组传递一个子程序时,可以用不同的尺寸/大小声明它作为调用者。
作为一个具体的例子,BMAIN在主程序中用DIMENSION(6,5)声明。 BMAIN作为BSUB传递给子程序,声明为:
INTEGER, INTENT(IN) :: BSUB(3,2,0:4)
问题:
BSUB中的条目是否只是从SBMAIN逐个填充,直到填满为止(按照此处Linear Indexing of Multi-Dimension Arrays in Fortran解释的顺序)?
编译器是否进行了任何维度匹配?例如,如果BSUB被声明为BSUB(0:4,3,2),它是否仍然在正确的位置保存正确的条目?
答案 0 :(得分:3)
Fortran中的多维数组以列主顺序存储。在内存中,元素是线性顺序,内存偏移量是根据多维索引计算的。等式在http://en.wikipedia.org/wiki/Row-major_order给出。 Fortran编译器将使用该等式并根据您提供的维度计算内存中的位置。要在声明具有不同尺寸的多维数组时找出元素之间的对应关系,请使用不同的维度应用方程两次。编译器不会在内存中移动值。它根据尺寸从索引值计算内存中的位置。
有些情况下,Fortran编译器生成的代码将复制值,从而创建临时数组。例如,如果调用中的实际数组参数涉及一个步幅,编译器可能需要创建一个连续的临时数组以与子例程的参数兼容。
答案 1 :(得分:3)
从Fortran 2008标准(12.5.2.11.4):
表示元素序列的实际参数 对应于一个伪参数,即一个数组是序列 如果伪参数是一个,则与伪参数相关联 显式形状或假定大小的数组。实际的等级和形状 参数不必同意伪参数的等级和形状, 但伪参数中的元素数量不得超过 实际参数的元素序列中的元素数。如果 伪参数是假定大小,即元素的数量 伪参数正是元素中元素的数量 序列
在子程序中使用不同的数组形状和等级是完全合法的,只是不要在子程序中引用比数组实际拥有的更多的元素。数组临时可能是必要的,但通常不是。