0

如何使用 Fortran 在例程和子程序之间创建链接?

Program Example

    common a,b,c,d,e
    print*,"Enter a"
          read*,a
    print*,"Enter coefficient of x in f1(x)"
          read*,b
    print*,"Enter intercept in f1(x)"
          read*,c
    print*,"Enter coefficient of x in f2(x)"
          read*,d
    print*,"Enter intercept in f2(x)"
          read*,e

    Print*,f1(2.),f2(3.)
    pause
    end
    !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    function f1(x)
    common a,b,c
    f1=a*x**2+b*x+c
    return
    end
    !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    function f2(y)
    common d,e
    f2=d*y+e
    return
    end
    !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

这是一个例子。当我打印 f1(2.) 和 f2(3.) 时,我得到第一个结果为真,第二个结果为假。

4

1 回答 1

5

您的帖子中有两个非常不同的问题。

  1. 我们如何在子程序之间共享数据?在现代 Fortran 中使用模块。我们对此有很多问题和答案。通用块已过时(并且自 Fortran 2018 正式过时 - 感谢@steve)。

  2. 为什么使用的结果common不正确?

您正在使用一个未命名的公共块。在普通块中,变量名称是无关紧要的。它们可以在编译单元(主程序、子程序)之间任意不同。顺序很重要。

因此你的

common d,e

和做的一样

common a,b

要访问公共块的第五个元素,您必须拥有所有五个变量

common a,b,c,d,e

(或者正如 francescalus 指出的那样,必须引用正确的数字存储单元。Ome 也可以有一个数组。)

最后,我想强调implicit none. 你真的应该使用它。

于 2021-11-24T07:14:54.810 回答