2012-03-12 3 views
5

(나는) 많은 다른 랭크와 타입의 데이터 배열을 포함하는 Fortran 파생 타입 T가 있습니다. 이러한 배열은 복잡한 데이터 구조의 내부에 숨겨져 내가 그의 getter 함수를하고 싶은 다음을 수행합니다Fortran 2003에서의 타입 바인딩 함수 오버로딩

"a"는 지정된 형태의 배열 포인터를, 그리고에 Data_ID는 정수
a => T%get(data_id) 

데이터 구조 내의 데이터를 찾는 데 사용됩니다. 나는 일반적인 이름으로 많은 "get_thistype()"함수를 오버로드함으로써 그렇게한다.

TYPE T 
    PROCEDURE :: get_real 
    PROCEDURE :: get_integer 
    GENERIC :: get => get_real,get_integer 
END TYPE 

get_thistype() 루틴이 서브 루틴이지만 함수로 쓰여지지 않은 경우에 작동합니다. 내가 훨씬 덜 읽을 찾을

CALL T%get(a,data_id) 

이 내 코드의 모습을 의미한다. 동일한 인수 목록이지만 다른 리턴 유형을 갖는 함수를 오버로드하는 방법이 있습니까? 아니면 서브 루틴을 사용해야합니까?

+1

컴파일러가 반환 형식에만 기반한 올바른 함수를 찾아내는 것은 어렵다고 생각합니다. 따라서 불가능할 것입니다. 난 그냥 서브 루틴을 사용합니다. – bdforbes

답변

5

Fortran에서 (포인터) 할당 문이 실행되면 할당이 수행되기 전에 항상 오른쪽이 항상 평가됩니다. 이것은 왼손에 독립적으로 발생하기 때문에 LHS가 RHS의 평가 결과에 영향을 줄 수있는 방법은 절대적으로 없습니다. 그것은 언어가 설계된 방식입니다. 내가 제대로 질문을 이해한다면

, 당신은 할당 연산자를 오버로딩하여이 작업을 수행 할 수 있습니다 : 누구의 이익이 미래에서 볼 이처럼

+0

젠장 ...하지만 어쨌든 고마워! – calys

0

난 그냥,이 게시물을 가로 질러왔다. 예 :

파일 X.f90 :

MODULE XModule 

TYPE :: X 
    INTEGER, DIMENSION(:), POINTER :: IntArray 
    REAL, DIMENSION(:), POINTER :: RealArray 
END TYPE 

INTERFACE ASSIGNMENT (=) 
    MODULE PROCEDURE PointToInt 
    MODULE PROCEDURE PointToReal 
END INTERFACE 

CONTAINS 

SUBROUTINE PointToInt(Ip, V) 
    INTEGER, POINTER, DIMENSION(:), INTENT(OUT) :: Ip 
    TYPE(X), INTENT(IN) :: V 
    Ip => V%IntArray 
END SUBROUTINE PointToInt 

SUBROUTINE PointToReal(Rp, V) 
    REAL, POINTER, DIMENSION(:), INTENT(OUT) :: Rp 
    TYPE(X), INTENT(IN) :: V 
    Rp => V%RealArray 
END SUBROUTINE PointToReal 

END MODULE 

테스트 드라이버 파일 Driver.f90 :

PROGRAM Driver 
USE XModule 
TYPE(X) :: Var 
INTEGER, DIMENSION(:), POINTER :: I 
REAL, DIMENSION(:), POINTER :: R 

ALLOCATE(Var%IntArray(2)) 
ALLOCATE(Var%RealArray(3)) 

Var%IntArray = [1, 2] 
Var%RealArray = [1., 2., 3.] 

I = Var 
PRINT*, I 

R = Var 
PRINT*, R 

END PROGRAM 

출력 :이 도움이

  1   2 
    1.000000  2.000000  3.000000  

희망.