2014-12-17 1 views
2

유형에 따라 선택하는 두 개의 루틴을 하나씩 호출합니다.
matc_atakano입니다. 내가 를 필요, matc_a에서 takano 호출 할 때Fortran 계단식 다형성

Case ("takano") 
    Call takano (a) 

을 다음과 같이 두 가지 루틴이 있습니다 그래서 Select Typetakano에 대한 호출을 래핑 또는 그냥 호출 할 수 있습니다 입니다

Subroutine takano & 
    (    & 
    a    & 
) 

Class (*), Intent (out) :: a 

Select Type (a) 
Type Is (Real (Real32)) 
    a = atan (Real(1,Real32)/Real(49,Real32)) 

Type Is (Real (Real64)) 
    a = atan (Real(1,Real64)/Real(49,Real64)) 

Type Is (Real (Real128)) 
    a = atan (Real(1,Real128)/Real(49,Real128)) 

End Select 

End Subroutine takano 


Subroutine matc_a & 
    (    & 
    a, strategy & 
) 

Class (*), Intent (out) :: a 
Character (len=*) :: strategy 

Select Case (Trim (strategy)) 

    Case ("takano") 

    Select Type (a) 
    Type Is (Real (Real32)) 
     Call takano (a) 
    Type Is (Real (Real64)) 
     Call takano (a) 
    Type Is (Real (Real128)) 
     Call takano (a) 
    End Select 

End Select 

End Subroutine matc_a 

답변

2

예, 짧은 버전을 사용하고 첫 번째 유형 선택을 피할 수 있습니다.

takano 중 하나를 사용하는지 여부는 중요하지 않습니다. 중요한 것은 다형성 가짜 인수를 허용한다는 것입니다.

사실, Fortran에서 동적 유형 지정 언어를 모방 한 것으로 보입니다. 그게 현명한 일인지 확실하지 않습니다.

+0

맞아요. 그들은 나중에 유용하게 될 것입니다. 따라서'matc_a'에서'Call takano (a)'를 사용하면'matc_a '를 호출 할 때'a'에 해당하는 출력 유형을 설정하게됩니까? – Zeus

+2

'matc_a'를 호출 할 때 실제로 출력 유형 'a'를 알아야합니다. 할당 가능하거나 포인터가 아니기 때문에 어떤 방법 으로든 내부에 설정할 수 없습니다. 그것을 찾기 위해'select type'을 사용할 수는 있지만 그것을 설정하는 것은 아닙니다. –