代码之家  ›  专栏  ›  技术社区  ›  Nathan Lee

我想知道下面的Fortran 77代码的作用

  •  1
  • Nathan Lee  · 技术社区  · 6 年前

    在.f文件中有这样做的代码:

    real Bob, avar
    ...
    avar = Bob( 8.3 )
    ...
    

    Bob似乎是一个函数,但在文件开头声明为real。

    然后有一个.d文件引用了Bob。我也知道,avar持有一个值,出现的是插值,问题是插值并不总是正确的。

    Bob    John      35
    -17.     -16.     -15.     -14.     -13.     -12.     -11.     -10.     -9.      -8.  
    -7.      -6.      -5.      -4.      -3.      -2.      -1.       0.       1.       2.5  
     3.       4.       5.       6.5      7.       8.       9.       10.      11.      12.  
     13.      14.      15.      16.      17.  
     0.001    0.001    0.041    0.098    0.155    0.213    0.27     0.327    0.384    0.441   
     0.499    0.556    0.613    0.670    0.728    0.785    0.844    0.904    0.965    1.058   
     1.089    1.152    1.216    1.314    1.347    1.413    1.479    1.543    1.609    1.670   
     1.733    1.799    1.860    1.925    1.937 
    

    这都是遗留代码。我没有写。我正在努力修复它。我的问题包括:

    这是做什么的,怎么做的?什么是.d文件?

    我认为这是在试图插补,但我不认为你可以用Fortran 77这样做。

    4 回复  |  直到 15 年前
        1
  •  1
  •   anon    15 年前

    看起来Bob是一个函数,它将实数8.3传递给它,并返回一个存储在avar中的实数。但这就是从您发布的代码中可以收集到的所有信息。

        2
  •  1
  •   Stefano Borini    15 年前

    看起来.d文件包含一些几乎是线性的数据。看起来像实验数据。35是你得到的点数,然后是x,然后是y。

    鲍勃和约翰似乎是某种字符串标记或标识符。它们可能在代码的某个地方被用来决定如何处理数据,或者它们表示的数据类型。

    鲍勃看起来像个函数。请注意,您有两种方法来声明函数。

    real function foo(a)
        implicit none
        real, intent(in) :: a
        foo = 3.0+a
    end function
    
    program test
       implicit none
       real foo, bar, a, b
       bar(b) = b+5.0
    
       a=foo(5.3)
       print *, a, bar(2.3)
    end program
    

    一种是显式情况(foo),通过将值赋给名为函数本身的变量来返回值。 另一种情况是“隐式”(不知道正式名称),请参见栏。您将它声明为“数组”,然后表示它应该如何工作。很少看到,但它是一个非常紧凑的写作。

        3
  •  0
  •   Nathan Lee    15 年前

    不好意思弄混了。答案是系统正在使用一个专用的宏C-to-Fortran程序进行插值。这发生在make文件中。我是通过看一些模糊的文件发现的。感谢大家的意见。再次为它的简洁而道歉。我不是想变得困难。我也对我所看到的感到困惑。使用从另一家公司购买的30年历史的遗留代码有时很困难。我对Fortran不熟悉,所以我觉得我没有看到我不熟悉的语言功能。我觉得很愚蠢。它确实让我更深入地挖掘。经验教训。

        4
  •  0
  •   user72260    15 年前

    A.D文件可能是某个dope删除.dat的方式。他太懒了,没法再打两个字。以前的程序员就是这样。

    它看起来像是在一个图上有一个简单的插值函数,其中“bob”是x轴从-17到+17,而“john”是y方向上对应于bob点的一组值。(不知道35代表什么,因为只显示32点。)

    代码要求:对于X轴上的值8.3,Y方向的插值值是多少。在线性形式下,它将返回0.3倍于1.413和1.479之间的差值。它可能是一个更高阶的内插程序,但您不显示代码,所以我假设是最简单的。