传递具有子程序中预期的更多元素的数组

时间:2014-01-30 12:31:44

标签: api fortran shared-libraries abi

我在共享库中有一个子程序:

SUBROUTINE DLLSUBR(ARR)
   IMPLICIT NONE
   INTEGER, PARAMETER :: N = 2
   REAL ARR(0:N)
   arr(0) = 0
   arr(1) = 1
   arr(2) = 2
END

我们假设我将通过以下方式从可执行文件中调用它:

REAL ARR(0:3)
CALL DLLSUBR(ARR)

注意:代码很高兴地编译并运行(DLLSUBR在模块内),而Debug + /check:all选项没有任何警告或错误。

这会导致内存损坏还是一些奇怪的行为?在哪里可以找到有关在Fortran规范中传递具有不同大小的数组的信息?

1 个答案:

答案 0 :(得分:3)

如果使伪参数元素计数更小或相等,则实际上允许通过序列关联规则显式形状数组。当子程序需要更多元素时,它被禁止。

显式形状数组通常需要通过副本传递参数。当编译器无法证明数组是连续的时(指针或假定的形状数组伪参数),就会发生这种情况。如果传递的元素数量较少,则子例程可以在复制数组部分后访问一些垃圾。

在你的情况下,一切都会好的,因为你正在向一个期望更少的子程序传递更多。

Fortran 2008 12.5.2.11.4:

  

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