Variables Fortran编译器术语:虚拟变量和属性

Variables Fortran编译器术语:虚拟变量和属性,variables,attributes,fortran,Variables,Attributes,Fortran,有人能给我解释一下,在解析器/编译器中,虚拟变量或属性对应于哪种抽象吗 PURE SUBROUTINE F(X, Y) IMPLICIT NONE REAL, INTENT(INOUT) :: X, Y, C C REAL :: A, B C REAL, SAVE :: C = 3.14E0 PARAMETER (C = 3.14E0, X = 32, Y = X) X = Y + 2 * S

有人能给我解释一下,在解析器/编译器中,虚拟变量或属性对应于哪种抽象吗

      PURE SUBROUTINE F(X, Y)
        IMPLICIT NONE
        REAL, INTENT(INOUT) :: X, Y, C
C        REAL :: A, B
C        REAL, SAVE :: C = 3.14E0
        PARAMETER (C = 3.14E0, X = 32, Y = X)
        X = Y + 2 * SIN(Y)
      END



Fortran通过引用传递。dummy属性对应于传递给函数的那些变量(
X
Y
)。parameter语句需要一些静态的东西,但是由于
X
是传递到函数中的任何东西,因此它实际上没有任何意义。parameter语句是一种设置常量的方法,它与子程序的参数无关

当你得到一个错误,说
C
不是一个
DUMMY
变量,那么,这意味着它没有在变量列表中找到
C
,这些变量将被传入/传出函数-你的声明只是
F(X,Y)
:看不到
C
。虽然您没有明确使用
DUMMY
属性,但是您有
INTENT(INOUT)
属性,这意味着这些变量对应于子例程输入/输出

要获得所需的内容,您需要一个类似以下内容的子例程:

subroutine F(X, Y)
    implicit none

    ! These are the dummy variables
    real, intent(inout) :: X, Y

    ! These are the variables in the scope of this subroutine
    real                  :: a, b
    real, parameter, save :: c = 3.14E0

    X = Y + 2*sin(Y)
end subroutine F
我不完全确定您想做什么-您正在声明一个
子例程,这意味着一个没有副作用的子例程,但您正在对变量使用
intent(inout)
,这意味着
X
Y
可以在执行过程中更改

我还要补充一点,在子例程中,初始化声明语句中的变量,如
REAL::C=3.14E0
,会生成一个具有隐式
save
属性的变量。但是,如果您希望从一个调用保存到另一个调用,那么通过显式地添加
save
属性来明确这就是您正在做的事情,您已经做了正确的事情


我不是一个解析器/编译器专家,但我认为要回答你的问题,
dummy
属性意味着你只需要得到一个指针——你不需要分配任何空间,因为函数调用中使用的变量已经分配了空间。

蒂姆·惠特科姆很好地解释了调用的实际问题。我将尝试更明确地解释这些术语

伪参数是Fortran特有的术语。它是其他语言所称的形式参数或类似参数,也就是说,它是被称为
X
Y
(在您的例子中)的对象,在调用过程时,witch与实际参数关联

因此,在:

subroutine s(i)
  integer :: i
end

call s(1)
i
是子例程
s
的伪参数,而表达式
1
是传递给子例程的伪参数
i
的实际参数

属性是指定数据对象或过程的附加属性的一种形式。可以使用以下语句指定属性:

real c
intent(in) c
optional c
也可以在单个声明中指定:

real, intent(in), optional :: c
这样,伪参数
c
是一个默认实数,具有属性
intent(in)
optional

冲突属性是不能同时为一个对象指定的属性。您使用
intent(…)
参数
的示例效果很好。它们是不兼容的,因为第一个表示伪参数,而另一个指定命名常量

real c
intent(in) c
optional c
real, intent(in), optional :: c