通过时调整多维数组的大小



本文中所有对数组的引用都是多维的

我开始知道,当一个数组传递给子例程时,它可以作为调用者声明不同的维度/大小。

作为一个具体的例子,BMAIN在主程序中用DIMENSION(6,5)声明。BMAIN作为BSUB传递给子例程,声明为:

INTEGER, INTENT(IN) :: BSUB(3,2,0:4)

问题:

BSUB中的条目是简单地从SBMAIN一个接一个地填充,直到它被填充(在这里解释的顺序多维数组在Fortran中的线性索引)?

编译器是否执行任何维度匹配?例如,如果BSUB被声明为BSUB(0:4,3,2),它是否仍然在正确的位置保存正确的条目?

来自Fortran 2008标准(12.5.2.11.4):

表示元素序列和的实际实参对应于一个虚拟参数,该参数是一个数组或序列关联到伪参数,如果伪参数是显式形状或假定大小的数组。实际的秩和形状实参不需要与虚拟实参的秩和形状一致;但是虚拟参数中的元素个数不能超过实际实参的元素序列中的元素个数。如果虚拟参数是假设大小,元素的数量虚拟参数是元素中元素的确切数量序列。

在子例程中使用不同的数组形状和秩是完全合法的,只是不要在子例程中引用比数组实际拥有的更多的元素。数组临时可能是必要的,但通常不是这样。

Fortran中的多维数组是按列为主顺序存储的。在内存中,元素按线性顺序排列,并根据多维索引计算内存偏移量。方程见http://en.wikipedia.org/wiki/Row-major_order。Fortran编译器将使用该方程并根据您提供的维度计算内存中的位置。在声明具有不同维度的多维数组时,要找出元素之间的对应关系,可以使用不同的维度应用该方程两次。编译器不会移动内存中的值。它根据维度计算索引值在内存中的位置。

在某些情况下,Fortran编译器生成的代码将复制值,创建一个临时数组。例如,如果调用中的实际数组参数涉及一个stride,编译器可能需要创建一个连续的临时数组以与子例程的参数兼容。

相关内容

  • 没有找到相关文章

最新更新