有人可以向我解释一下虚拟变量或属性对应的解析器/编译器中的抽象是什么吗?
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
cetin@unique:~/lab/secret/tapenade$ gfortran -x f77 -c 1.f 1.f:6.37: PARAMETER (C = 3.14E0, X = 32, Y = X) 1 Error: PARAMETER attribute conflicts with DUMMY attribute in 'x' at (1) 1.f:3.38: REAL, INTENT(INOUT) :: X, Y, C 1 Error: Symbol at (1) is not a DUMMY variable
cetin@unique:~/lab/secret/tapenade$ ifort -c 1.f 1.f(3): error #6451: A dummy argument name is required in this context. [C] REAL, INTENT(INOUT) :: X, Y, C -------------------------------------^ 1.f(6): error #6406: Conflicting attributes or multiple declaration of name. [X] PARAMETER (C = 3.14E0, X = 32, Y = X) -------------------------------^ 1.f(6): error #6406: Conflicting attributes or multiple declaration of name. [Y] PARAMETER (C = 3.14E0, X = 32, Y = X) ---------------------------------------^ 1.f(6): error #6592: This symbol must be a defined parameter, an enumerator, or an argument of an inquiry function that evaluates to a compile-time constant. [X] PARAMETER (C = 3.14E0, X = 32, Y = X) -------------------------------------------^ compilation aborted for 1.f (code 1)
Tim Whitcomb.. 10
Fortran通过引用传递.伪属性对应到在传递给函数(这些变量X
和Y
你的情况).参数语句期望某些东西是静态的,但由于X
是传递给函数的任何东西,它实际上没有任何意义.参数语句是一种设置常量的方法 - 它与子例程的参数没有任何关系.
当你得到错误说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
我不完全知道你正在尝试做的-你宣布一个pure
子程序,这意味着无副作用的子程序,但你正在使用intent(inout)
你的变数,这意味着X
和Y
在执行过程中被改变.
我还要在子例程中添加一个变量,在其声明语句中初始化变量,就像REAL :: C = 3.14E0
产生一个带隐式 save
属性的变量一样.但是,如果您希望将其从呼叫保存到呼叫,那么您已经通过明确添加save
属性来做正确的事情,以明确这就是您正在做的事情.
我不是解析器/编译器的人,但我认为要回答你的问题,该dummy
属性意味着你只是得到一个指针 - 你不必分配任何空间,因为函数调用中使用的变量已经有空间分配.
Fortran通过引用传递.伪属性对应到在传递给函数(这些变量X
和Y
你的情况).参数语句期望某些东西是静态的,但由于X
是传递给函数的任何东西,它实际上没有任何意义.参数语句是一种设置常量的方法 - 它与子例程的参数没有任何关系.
当你得到错误说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
我不完全知道你正在尝试做的-你宣布一个pure
子程序,这意味着无副作用的子程序,但你正在使用intent(inout)
你的变数,这意味着X
和Y
在执行过程中被改变.
我还要在子例程中添加一个变量,在其声明语句中初始化变量,就像REAL :: C = 3.14E0
产生一个带隐式 save
属性的变量一样.但是,如果您希望将其从呼叫保存到呼叫,那么您已经通过明确添加save
属性来做正确的事情,以明确这就是您正在做的事情.
我不是解析器/编译器的人,但我认为要回答你的问题,该dummy
属性意味着你只是得到一个指针 - 你不必分配任何空间,因为函数调用中使用的变量已经有空间分配.