子程序中的数组,Fortran 77

3
我正在尝试理解以下Fortran代码: http://heath.cs.illinois.edu/courses/cs598mh/george_liu.pdf 具体来说,是在子程序中数组变量声明的部分。以下是一个示例:
      SUBROUTINE ROOTLS (ROOT, XADJ, ADJNCY, MASK, NLVL, XLS, LS)
C
         INTEGER ADJNCY(1), LS(1), MASK(1), XLS(1)
         INTEGER XADJ(1), I, J, JSTOP, JSTRT, LBEGIN

我对数组名称后面的(1)感到困惑,例如ADJNCY(1)XADJ(1)。这些数组肯定比1大。在这些声明中,(1)是什么意思?

1个回答

3
实际上,这不是FORTRAN 77,而是FORTRAN 66 ;-) (1) FORTRAN 66 中的一个把戏,用于构建类似于 假定大小数组 的东西。在 FORTRAN 77 中,这被标准化为 (*)
假定大小意味着数组的实际长度取决于传递给子例程的实际数组的长度。注意,数组的形状不一定会被保留!请参见 此处 以获取关于此的详细说明。

仅仅因为某人使用了旧的约定并不意味着代码就是那么老旧。我对链接中声称现代编译器禁止此类操作感到惊讶,英特尔却接受它。显然,你不应该继续在新代码中使用这种方法,但没有理由去修改旧的库代码来修复它。 - agentp
1
@agentp 如果编译器不检查参数(例如外部库),那么它将接受它!但是一旦你为函数/子程序提供了接口(例如在模块中使用),编译器几乎肯定不会接受它。 - Alexander Vogt
@agentp,一旦子程序开始访问第一个元素之后的任何内容,代码就不符合标准。如果启用了边界检查,我会非常惊讶如果它没有捕获到它。我不知道标准中是否有任何允许这种情况的异常。 - Vladimir F Героям слава
就目前而言,即使启用边界检查,ifort也接受它。 (1)似乎被特别视为定义了一个与(*)相同的假设大小数组,而其他任何东西,例如(2),则被视为实际维度。 - agentp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接