2013-07-09 87 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年代初期編寫的許多系統都使用這種技術。它將以任何支持結構和動態內存分配的語言工作。

相關問題