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

时间:2014-06-29 03:27:37

标签: arrays multidimensional-array fortran

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

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

作为一个具体的例子,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),它是否仍然在正确的位置保存正确的条目?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

从Fortran 2008标准(12.5.2.11.4):

  

表示元素序列的实际参数   对应于一个伪参数,即一个数组是序列   如果伪参数是一个,则与伪参数相关联   显式形状或假定大小的数组。实际的等级和形状   参数不必同意伪参数的等级和形状,   但伪参数中的元素数量不得超过   实际参数的元素序列中的元素数。如果   伪参数是假定大小,即元素的数量   伪参数正是元素中元素的数量   序列

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