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
Fortran编译器在将属性视为';保存属性';?_Fortran_Numerical Recipes - Fatal编程技术网

Fortran编译器在将属性视为';保存属性';?

Fortran编译器在将属性视为';保存属性';?,fortran,numerical-recipes,Fortran,Numerical Recipes,我们有一个旧的Fortran脚本,我们正在尝试使用Intel的Visual Fortran重新编译它,但是我们得到的计算错误和与旧编译版本代码不同的结果 我们在下面的代码中发现了我们认为存在的问题(这大致来自于数字配方) 问题是每次调用都会重置“it”参数,但它应该存储在函数调用之间 我们对问题所在的最佳猜测是,较旧的编译器可能将“it”视为“save属性”,因此在函数调用之间存储它 我们在这里可能完全错了,如果一些Fortran大师能够证实这一点或有更好的解释,我们将需要一些帮助

我们有一个旧的Fortran脚本,我们正在尝试使用Intel的Visual Fortran重新编译它,但是我们得到的计算错误和与旧编译版本代码不同的结果

我们在下面的代码中发现了我们认为存在的问题(这大致来自于数字配方)

问题是每次调用都会重置“it”参数,但它应该存储在函数调用之间

我们对问题所在的最佳猜测是,较旧的编译器可能将“it”视为“save属性”,因此在函数调用之间存储它

我们在这里可能完全错了,如果一些Fortran大师能够证实这一点或有更好的解释,我们将需要一些帮助

      subroutine TrapezoidalRule(Func, a, b, s, n)
*
*     This routine performs the trapezoidal rule, see Numerical Recipes
*
      implicit none
      real*8 Func, a, b, s
      Integer*4 n
      external Func
*
      real*8 del, x, sum
      Integer*4 it, tnm, j
*
      if (n .eq. 1) then
*
         s=0.5d0*(b-a)*(Func(a)+Func(b))
         it=1
*
      else
*
         tnm=it
         del=(b-a)/dble(tnm)
         x=a+0.5d0*del
         sum=0.d0
         do 11 j=1,it
*
            sum=sum+Func(x)
            x=x+del
*
11       continue
*
         s=0.5d0*(s+(b-a)*sum/dble(tnm))
         it=2*it
*
      endif
*
      return
      end

是的,这个解释是合理的。代码访问变量
it
at

   tnm=it
save
时,此值未定义

旧的编译可能根本没有使用堆栈,可能对所有变量都使用了静态存储。它也可能使用了堆栈,但它从未被覆盖,而且值恰好位于同一位置。谁知道呢,我们没有这些信息要知道


有一些编译器选项可以强制将
save
属性设置为此类错误代码的所有变量(“code>save
for all”从来都不是标准的!)。这只是英特尔Fortran的
-save

是的,解释是合理的。代码访问变量
it
at

   tnm=it
save
时,此值未定义

旧的编译可能根本没有使用堆栈,可能对所有变量都使用了静态存储。它也可能使用了堆栈,但它从未被覆盖,而且值恰好位于同一位置。谁知道呢,我们没有这些信息要知道


有一些编译器选项可以强制将
save
属性设置为此类错误代码的所有变量(“code>save
for all”从来都不是标准的!)。这只是英特尔Fortran的
-save

好吧,你想听什么?有点,有点。。。如果你有理由相信,那么这可能是真的。那么,问题是什么?说这是可能的?是的,这是可能的。但是你还想要什么呢?我的意思是,我们没有你的好结果和错误结果。我们不知道它们的不同之处,我们无法复制这些测试。我们真的不能再相信你了。添加
保存
属性是否有帮助?我们甚至不知道它是哪个编译器。如果我的问题不清楚,我很抱歉。这里有点沮丧。问题是,我们不知道使用了哪个编译器,因为还没有人参与最初的工作。我们希望对Fortran有深入了解的人知道“save属性”在过去是如何处理的,因为我们很难找到关于这一点的好信息。是的,Fortran 77编译器执行save操作时很常见,就好像所有变量都应用了save一样。据我所知,所有当前的编译器都提供了选择这种非标准行为的选项。这之前已经讨论过了,例如,你想听什么?有点,有点。。。如果你有理由相信,那么这可能是真的。那么,问题是什么?说这是可能的?是的,这是可能的。但是你还想要什么呢?我的意思是,我们没有你的好结果和错误结果。我们不知道它们的不同之处,我们无法复制这些测试。我们真的不能再相信你了。添加
保存
属性是否有帮助?我们甚至不知道它是哪个编译器。如果我的问题不清楚,我很抱歉。这里有点沮丧。问题是,我们不知道使用了哪个编译器,因为还没有人参与最初的工作。我们希望对Fortran有深入了解的人知道“save属性”在过去是如何处理的,因为我们很难找到关于这一点的好信息。是的,Fortran 77编译器执行save操作时很常见,就好像所有变量都应用了save一样。据我所知,所有当前的编译器都提供了选择这种非标准行为的选项。这之前已经讨论过,例如,感谢您确认这可能是可能的,我将深入探讨。我有点担心,因为有很多代码,这可能意味着这将是项目中经常出现的问题。您可以尝试我引用的
-save
选项。你可以查阅手册了解更多信息。英特尔支持论坛上也有相关的帖子。感谢您确认这可能是可行的,我将深入探讨。我有点担心,因为有很多代码,这可能意味着这将是项目中经常出现的问题。您可以尝试我引用的
-save
选项。你可以查阅手册了解更多信息。英特尔支持论坛上也有相关的帖子。