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