将数组数据传递给具有公共块的子程序

时间:2014-01-25 10:20:35

标签: arrays function fortran subroutine fortran77

关于将数组传递给函数和/或子例程,我有点头疼。我的代码看起来或多或少如下。

program test
implicit none

integer arraySize
parameter (arraySize = 10)

integer myFunction

integer someValue
integer array1(arraySize,arraySize)
...


...
someValue = myFunction(arraySize,array1)
...

end


integer function myFunction(arraySize,array1)
implicit none

integer arraySize
integer array1(arraySize,arraySize)

...

end

我可以编译这种类型的子程序,并对数组中的值进行相关的数学计算。这是通过几个4维阵列完成的,所有4维阵列都以与上述相同的方式定义。

但是,我有一个子程序,我希望传递其中的5个数组,并对值进行一些数学运算。我想我会尝试使用通用语句来简化子例程语句,而不是将每个数组作为参数。所以我有以下内容:

program test2
implicit none

integer arraySize
parameter (arraySize = 10)

integer array1(arraySize,arraySize)
integer array2(arraySize,arraySize)
integer array3(arraySize,arraySize)
common /myArrays/ array1, array2, array3

...
call arraySum(arraySize)
...

end


subroutine arraySum(arraySize)
implicit none

integer arraySize

integer array1(arraySize,arraySize)
integer array2(arraySize,arraySize)
integer array3(arraySize,arraySize)
common /myArrays/ array1,array2,array3

...

end

我尝试编译,我收到此错误

integer array1(arraySize,arraySize)
              1
Error: Variable 'arraysize' at (1) in this context must be constant

我很困惑,原因有很多。我误解了如何使用常见语句吗?当然,如果我可以像我的第一个例子那样将数组的大小传递给子程序,那么为什么这种方法会产生任何差别;或者我是否需要在子例程中重新定义另一个整数并使其成为一个等于arraySize值的常量?或者它只是F77的一个怪癖,我应该咬牙切齿并在子程序参数中传递所有3个数组?

我为代码的古老风格道歉,如果我对Fortran编程的原理有任何误解(我以前唯一的经验是使用C& C ++)。我想使用比F77更新的东西,但它目前不是一个选项(学生)。

1 个答案:

答案 0 :(得分:1)

答案的摘要是,当且仅当数组是子程序中的伪参数时,才能传递数组的大小。

来自standard

  

每个数组声明符都是实际的数组声明符或虚拟数组声明符。

     

5.1.2.1实际数组声明者。
  实际的数组声明符是一个数组声明符,其中数组名称不是伪参数。每个实际的数组声明符必须是一个常量数组声明符。 [..] COMMON语句中允许使用实际的数组声明符

     

5.1.2.2虚拟阵列声明器。
  虚拟数组声明符是一个数组声明符,其中数组名称是伪参数。虚拟数组声明符可能是[..]可调整的数组声明符[..]。虚拟数组声明符只能出现在函数或子例程子程序中。

如果要在公共块中传递数组,则需要将边界作为整数常量表达式。如您所说,您可以在子程序中再次定义数组大小。使用源预处理器可以是帮助保持一致性的一种方法。或者,正如@george建议的那样,使用标准友好的include语句(只是确保你使用的是构建系统)。

那就是说,我建议最好将数组作为参数传递:当你想使用“动态”数组方法时,事情会变得非常棘手,而不必担心存储关联。