2013-07-09 90 views
1

我想计算子例程(或函数)中的派生数据类型。我将如何引用子例程参数中的变量?Fortran:如何将类型变量传递给子例程

到目前为止,我可以通过引用整个对象,然后引用子例程中的变量来实现我的目标。有没有办法在子例程参数中只引用变量myObj%var?

PROGRAM test 

    TYPE obj 
     INTEGER :: var 
    END TYPE obj 

    TYPE (obj) :: myObj 
    CALL set(myObj) 
    PRINT*, myObj%var 

     CONTAINS 

    SUBROUTINE set(myObj) 
     TYPE (obj) :: myObj 
     myObj%var = 5 
    END SUBROUTINE set 

END PROGRAM test 

回答

2

你可以简单地写

SUBROUTINE set(an_int) 
    integer, intent(inout) :: an_int 
    an_int = 5 
END SUBROUTINE set 

,然后调用这样的子程序:

CALL set(myObj%var) 

我的看法,这是有悖常理的组件打包成派生类型,然后将其解压到通过程序只是一个意见,你可以自由地忽略它。就个人而言,我会对代码进行更彻底的重写,如下所示。不过要注意的是,这使用了2003标准中引入的一些功能,尽管这些功能是在最广泛使用的编译器的当前版本中实现的。

MODULE mytype 

    IMPLICIT NONE 

    TYPE obj 
    INTEGER, PRIVATE :: var 
    CONTAINS 
    PROCEDURE, PASS :: get_var 
    PROCEDURE, PASS :: set_var 
    END TYPE obj 

CONTAINS 

    SUBROUTINE set_var(this,an_int) 
    CLASS(obj), INTENT(inout) :: this 
    INTEGER, INTENT(in) :: an_int 
    this%var = an_int 
    END SUBROUTINE set_var 

    INTEGER FUNCTION get_var(this) 
    CLASS(obj), INTENT(inout) :: this 
    get_var = this%var 
    END FUNCTION get_var 

END MODULE mytype 


PROGRAM test 

    USE mytype 
    IMPLICIT NONE 

    TYPE (obj) :: myObj 
    CALL myobj%set_var(12) 
    PRINT*, myObj%get_var() 

END PROGRAM test 
+0

我同意我不会仅仅用一个函数来初始化它的变量。我正在尝试一个测试版本。最终,我将使用不同对象的不同变量进行计算。 – astromonerd

1

如果你只有一个没有所有2003/2008位的F95编译器,这就是它的工作方式。

MODULE ObjMod 
    IMPLICIT NONE 

    TYPE ObjType 
    INTEGER, PRIVATE :: var 
    END TYPE ObjType 

CONTAINS 

    SUBROUTINE ObjCreate(this) 
    TYPE(ObjType), POINTER :: this 
    allocate(this) 
    END SUBROUTINE ObjCreate 

    SUBROUTINE ObjDelete(this) 
    TYPE(ObjType), POINTER :: this 
    deallocate (this) 
    END SUBROUTINE ObjDelete 

    SUBROUTINE ObjSet(this, value) 
    TYPE(ObjType), INTENT(inout) :: this 
    INTEGER, INTENT(in) :: value 
    this%var = value 
    END SUBROUTINE ObjSet 

INTEGER FUNCTION ObjGet(this) 
    TYPE(ObjType), INTENT(inout) :: this 
    ObjGet = this%var 
END FUNCTION ObjGet 

END MODULE ObjMod 


PROGRAM test 

USE ObjMod 
IMPLICIT NONE 

TYPE (ObjType), POINTER :: testObj 

CALL ObjCreate(testObj) 
CALL ObjSet(testObj, 12) 
PRINT*, ObjGet(testObj) 
CALL ObjDelete(testObj) 
STOP 
END PROGRAM test 

我还使用了前一个像样的C++编译出来的代码一样,在C在80年代初。你会发现,在70年代到90年代初期编写的许多系统都使用这种技术。它将以任何支持结构和动态内存分配的语言工作。

相关问题