2014-11-12 3 views
1

두 개의 함수가 있습니다. 하나는 구분 된 문자열을 정수 배열 배열로, 다른 하나는 실제 배열로 나눕니다. 나는 과부하하려고 노력하고있다.Fortran OOP 함수 오버로드

Interface split 
    Module Procedure split_to_int_unidim 
    Module Procedure split_to_real_unidim 
End Interface split 

Function split_to_int_unidim (a, delim, pos) Result (b) 
    Character(len=*), Intent (in) :: a, delim 
    Character(len=*), Intent (in), Optional :: pos 
    Integer, Allocatable :: b(:) 
End Function 

Function split_to_real_unidim (a, delim, pos) Result (b) 
    Character(len=*), Intent (in) :: a, delim 
    Character(len=*), Intent (in), Optional :: pos 
    Real, Allocatable :: b(:) 
End Function 

나는 오류

gfortran -o build/lib/foul.o -c -ffree-form -g -J./build/lib lib/foul.f 
lib/foul.f:22.41: 

Module Procedure split_to_real_unidim 
            1 
Error: Ambiguous interfaces 'split_to_real_unidim' and 'split_to_int_unidim' 
in generic interface 'split' at (1) 

나는 기능의 반환은 다른 유형의이기 때문에, 내가 확인 될 것이라고 기대했다을 얻고있다. 그러나 나는 오류를보고 착각 한 것 같습니다. 같은 이름을 사용하여 전화 할 수있는 방법이 있습니까? 그렇다면 어떤 수정을해야합니까?

+0

반환형 함수 서명의 일부가 아닌 다음

따라서 용액 것이다. 컴파일러가 두 메소드를 구별 할 수있는 인자가 다른 타입의 인자 만 있습니다. – ja72

+0

세부 사항을 가져 주셔서 감사합니다. – Zeus

+0

가능한 오타 : 두 번째 방법은 'split_to_real_unidim'이 아닙니다. – ja72

답변

0

이 두 함수를 사용할 때의 한 가지 문제점은 에 변수의 모호성을 해결하기위한 추가 변수를 포함하면 이 직관적이지 않게 사용된다는 것입니다. 이 문제는 이 정수가 아닌 실제 배열로 구분 된 문자열을 분할하기를 원하기 때문에 발생합니다. 은 직관적이지 않은 변수를 포함해야한다는 것을 기억해야합니다.

첫 번째 출력 요소 인 b1을 출력 인수로 포함하는 것이 좋습니다. 두 함수를 모두 사용하면 모호성 문제도 해결됩니다.

Interface split 
    Module Procedure split_to_int_unidim 
    Module Procedure split_to_real_unidim 
End Interface split 

Function split_to_int_unidim (a, delim, b1, pos) Result (b) 
    Character(len=*), Intent (in) :: a, delim 
    Character(len=*), Intent (in), Optional :: pos 
    Integer, Intent(out) :: b1 
    Integer, Allocatable :: b(:) 

    ... 

    b1 = b(1) 

End Function 

Function split_to_real_unidim (a, delim, b1, pos) Result (b) 
    Character(len=*), Intent (in) :: a, delim 
    Character(len=*), Intent (in), Optional :: pos 
    Real, Intent(out) :: b1 
    Real, Allocatable :: b(:) 

    ... 

    b1 = b(1) 

End Function 
+0

그 경우 서브 루틴으로 만드십시오. –

+0

하나의 데이터 유형 정보를 채우기 위해 필자는 함수를 사용합니다. 다른 변수 이름을 사용하여 변수를 분할하려면'서브 루틴 분할 (a, delim, b1, b2, b3, pos)'이 있습니다. – Zeus

+2

그것은 당신의 디자인 선택이지만, 일반적인 것이 아닙니다. 그들이 본질적으로'전송'을 위해 어떻게했는지를 보아라. 그들은 가짜 출력 인자를 포함하지 않았고, 단지 타입 만이 중요한 거짓 입력을 포함했다. –