2013-07-09 2 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++ 컴파일러가 나왔다 전에 80 년대 초, C에서 그런 식으로 코딩하는 데 사용됩니다. 90 년대 초반까지 70 년대에 작성된 많은 시스템이이 기술을 사용한다는 것을 알게 될 것입니다. 구조와 동적 메모리 할당을 지원하는 모든 언어로 작동합니다.

관련 문제