当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Fortran编译器术语:虚拟变量和属性》经验,为你挑选了1个好方法。

有人可以向我解释一下虚拟变量或属性对应的解析器/编译器中的抽象是什么吗?

      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通过引用传递.伪属性对应到在传递给函数(这些变量XY你的情况).参数语句期望某些东西是静态的,但由于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)你的变数,这意味着XY在执行过程中被改变.

我还要在子例程中添加一个变量,在其声明语句中初始化变量,就像REAL :: C = 3.14E0产生一个带隐式 save属性的变量一样.但是,如果您希望将其从呼叫保存到呼叫,那么您已经通过明确添加save属性来做正确的事情,以明确这就是您正在做的事情.

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



1> Tim Whitcomb..:

Fortran通过引用传递.伪属性对应到在传递给函数(这些变量XY你的情况).参数语句期望某些东西是静态的,但由于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)你的变数,这意味着XY在执行过程中被改变.

我还要在子例程中添加一个变量,在其声明语句中初始化变量,就像REAL :: C = 3.14E0产生一个带隐式 save属性的变量一样.但是,如果您希望将其从呼叫保存到呼叫,那么您已经通过明确添加save属性来做正确的事情,以明确这就是您正在做的事情.

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

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有