Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Fortran函数重新定义数组_Arrays_Fortran - Fatal编程技术网

Arrays Fortran函数重新定义数组

Arrays Fortran函数重新定义数组,arrays,fortran,Arrays,Fortran,我有一个Fortran函数的代码,我很好奇参数X发生了什么 DOUBLE PRECISION FUNCTION PBOIL(NGamma,T,X) IMPLICIT DOUBLE PRECISION(A-H,O-Z) DIMENSION X(NGamma),GAMMA(NGamma) X传入时是数组吗?第三行中声明的X与参数X不同吗?第一行将函数PBOIL定义为具有三个参数 DOUBLE PRECISION FUNCTION PBOIL(NGamma,T,X) IMPLICIT DOUBLE

我有一个Fortran函数的代码,我很好奇参数X发生了什么

DOUBLE PRECISION FUNCTION PBOIL(NGamma,T,X)
IMPLICIT DOUBLE PRECISION(A-H,O-Z)
DIMENSION X(NGamma),GAMMA(NGamma)

X传入时是数组吗?第三行中声明的X与参数X不同吗?

第一行将函数PBOIL定义为具有三个参数

DOUBLE PRECISION FUNCTION PBOIL(NGamma,T,X)
IMPLICIT DOUBLE PRECISION(A-H,O-Z)
DIMENSION X(NGamma),GAMMA(NGamma)
第二行表示,默认情况下,包括名称以字母A-H和O-Z开头的参数在内的变量将声明为双精度,而不是单精度浮点

第三行表示参数X和局部变量GAMMA是数组,长度为ngama

几乎所有当前的gen FORTRAN教科书都应该解释上述内容


我没有玩过任何现代FORTRAN编译器。我最后一次认真接触FORTRAN是在20世纪80年代中期。根据我当时的经验,如果试图用FORTRAN声明一个动态大小的本地数组,我会感到非常不舒服。我不明白为什么现代编译器不能做到这一点,因为现在几乎每台机器都有一个像样的运行时堆栈,但我当时使用的机器没有做到这一点。CDC 6600是我第一次学习FORTRAN的机器,它没有堆栈,我很确定它的FORTRAN编译器不允许使用可变尺寸的本地数组。

要回答您的问题:

X传入时是数组吗? 对。这是一个双精度阵列,一维范围为NGamma

第三行中声明的X与参数X不同吗? 首先,一个术语:在Fortran中,X是一个伪参数,它与调用者的实际参数相关联。在Fortran中,参数是完全不同的beast:参数在Fortran中是命名常量

是的,作为伪参数的X与DIMENSION语句中的X相同。它从隐式双精度语句获取其类型

现代意识形态的Fortran将有类似这样的声明

  DOUBLE PRECISION, DIMENSION(NGamma), INTENT(IN) :: X
这会让读者明白这是一个数组伪参数 功能不允许对其进行更改


GAMMA被声明为与X形状相同的数组。这曾经是无效的FORTRAN 77,但被许多编译器接受为扩展,但对于FORTRAN 90或更高版本来说是完全正确的。

。告诉我们您尝试了什么,以及为什么它不能满足您的需求。这表明你已经花了时间来帮助自己,它避免了我们重复显而易见的答案,最重要的是它帮助你得到一个更具体和相关的答案。还可以看到,我主要是在网上阅读有关函数的内容。但很难理解如何定义参数类型。因此,做更多的研究,似乎参数类型是在第3行定义的。值得注意的是,假设fortran 90+,局部变量gamma会自动声明为长度ngama。另一方面,X必须在调用例程中声明足够长。我想说的恰恰相反,当前的gen Fortran教科书将跳过这一点,并将其留给关于过时特性的部分。至少我的Fortran 95/2003解释了10多年!是这样的。正如我所说,自从我上次使用FORTRAN以来,已经有很长一段时间了。当时,它是FORTRAN 77,在哈里斯超级迷你计算机上,有一个24位字。我不想念它。好的,我最近确实看过STARTRK源代码,但那是CDC 6600 FORTRAN IV,我对CDC 6600 FORTRAN和STARTRK代码都有丰富的经验。