arrays - 传递比实际小的数组

标签 arrays fortran

在下面的代码中,我声明了一个包含 20 个元素的数组 mass。当传递给子例程 foo 时,foo 被告知 mass 只有 10 个元素。但是,我仍然可以访问第 20 个元素。我的问题是:

  • 为什么我可以将数组传递给子程序并告诉子程序错误的数组大小?

  • 为什么我仍然可以访问第 20 个元素,即使子例程认为它只有 10 个元素?

  • 我在 foo 中对数组中第 20 个元素所做的任何更改是否会保留在数组中,就像 foo 知道正确大小一样数组?

代码如下:

  program test
  implicit none

  integer num2,i
  real*8 mass(20)

  num2=10

  do i = 1,num
     mass(i) = 1.d0
  end do

  call foo(num2,mass)

  end


  subroutine foo(num2,mass)

  integer num2
  real*8 mass(num2)
  write(*,"(A20,E15.9)") "first one:",mass(1)
  write(*,"(A20,E15.9)") "tenth one:",mass(10)
  write(*,"(A20,E15.9)") "twentieth one:",mass(20)

  continue

  end

注意:子例程被告知数组大小错误的情况是我在尝试修改以供自己使用的其他人代码中遇到的情况。

最佳答案

您的问题存在一些误解,我将在此答案中加以说明。 answer by M. S. B. 中给出了一些实际意义。 .

你说你声明了一个包含 20 个元素的数组 mass,但是告诉 foo 它只有 10 个元素。这是不正确的。

你拥有的实际上是两个不同的实体:主程序中的一个数组 mass,有 20 个元素,以及一个大小为 10 的数组(也称为 mass)。子程序 foo.

“传递”是在这两个实体之间建立关联(所谓的参数关联)。主程序中名为 mass 的数组是子程序中的实际参数,子程序中名为 mass 的数组是虚拟参数。

虚拟参数是一个显式形状的数组,范围为 num2(这也是与主程序的 num2 关联的参数)。虚拟参数的第一个 num2 元素与实际参数的第一个 num2 元素相关联。 [这就导致要求主程序中的数组中至少有num2个元素。]

那么,第一个问题的答案

Why can I pass an array to a subroutine and tell the subroutine the wrong size for the array?

就是这样:你并没有告诉它错误的大小,你只是说子例程中的数组对应于参数的第一个 num2 个元素。

Why can I still access the 20th element even though the subroutine thinks it only has 10 elements?

这是一个编程错误。不允许使用大于数组范围的下标值。当你尝试这个时会发生什么取决于编译器。正如另一个答案所说,这很可能只是访问(由于实现关联的方式)内存中与实际参数的大元素相对应的位置。但同样,编译器可能会提示(尤其是选择了检查编译选项的那些),或者如果传递是通过临时复制完成的,那么事情可能会崩溃。 [后者不太可能。]

终于

Would any changes I make to the 20th element in the array while in foo remain with the array just the same as if foo knew the proper size of the array?

这又是特定于实现的。没有正确的 Fortran 答案,因为您的程序不符合要求。与前一点一样,如果这是与实际参数的适当元素相对应的内存区域并且没有边界检查,则更改可能会持续存在。如果编译器选择进行复制,则可能会发生崩溃,或者在返回时可能会忽略超出范围的更改。 [同样,最后两个不太可能,因为它需要编译器“聪明”。]

关于arrays - 传递比实际小的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34520550/

相关文章:

php - undefined offset : 0 error when using inval() converted indexes

javascript - 从具有重复值的数组创建对象

linux - Fortran 位置 ='append' 不起作用

arrays - Fortran 中继承派生类型问题的可分配数组

segmentation-fault - Fortran 奇怪的赋值,是 4294967295 == .true.?

java - 编写一个返回对象数组中最大对象的方法

c++ - 在函数中传递二维数组时出错

java - Java和C中数组的区别

arrays - 在 Fortran 中将指针分配给可分配的派生类型组件

debugging - Fortran查询并打印出函数或子程序名称