2014-12-05 3 views
1

문자열의 내용을 숫자 유형 (int, real, 배정도, real (real128))으로 변환하는 서브 루틴을 갖고 싶습니다.Fortran에서 숫자로 문자열 변환

그러나 Class(*)을 사용하려고하면 오류가 발생합니다. 오류 는 다음과 같습니다 :

gfortran -o build/lib/larsa.o -c -ffree-form -g -J./build/lib lib/larsa.f 
lib/larsa.f:1933.35: 

Read (s, frmt, iostat=ios) num 
           1 
Error: Data transfer element at (1) cannot be polymorphic unless 
it is processed by a defined  input/output procedure 
lib/larsa.f:1935.32: 

Read (s, *, iostat=ios) num 
          1 
Error: Data transfer element at (1) cannot be polymorphic unless 
it is processed by a defined input/output procedure 

이것은 내가 작성한 서브 루틴이다.

Subroutine converts_str_to_num & 
    (       & 
    s, num,      & 
    fmt, wrn     & 
) 

Character (len=*), Intent (in) :: s 
Character (len=*), Intent (in), Optional :: fmt 

Class (*) :: num 
Character (len=*), Intent (inout), Optional :: wrn 

Integer :: ios 
Character (len=65) :: frmt 

!!$ Reads contents of s and puts value in i. 

If (Present (fmt)) Then 
    frmt = "(" // Trim (fmt) // ")" 
    Read (s, frmt, iostat=ios) num 
Else 
    Read (s, *, iostat=ios) num 
End If 

End Subroutine converts_str_to_num 
+1

무엇이 당신의 질문입니까? 오류 메시지는 분명합니다 : 정의 된 I/O를 사용하지 않는 한 I/O 목록에서 다형 변수를 사용할 수 없습니다. 그게 무슨 뜻 이니? – francescalus

+0

해결 방법이 있고 거기에'Class (*)'가 있습니까? – Zeus

+4

@ChristopherDimech 그렇습니다. 'select type' 구조체를 사용하고 처리하고자하는 모든 유형의 사례를 작성하십시오. – casey

답변

4

의견을 정리하려면 답변을 제공해 드리겠습니다.

오류 메시지가 분명합니다. 정의 된 입/출력으로 목록을 처리하지 않는 한 입/출력 목록에 다형 변수를 사용할 수 없습니다. 이것은 Fortran 2008에서 9.6.3.5입니다. class(*) num은 (무제한) 다형성입니다.

이제 다형 파생 형에 대해 정의 된 입출력 프로 시저를 정의 할 수 있지만 많은 작업으로 간주되며 gfortran은 확실히 (아직) 그 개념을 지원하지 않습니다. 또한 내장 유형에 대해서는이 작업을 수행 할 수 없습니다. 이러한 요소는 입력 목록에서 비 다형성 변수를 처리해야 함을 의미합니다.

물론 다형성을 피하기 위해 제네릭을 사용할 수도 있지만 대체 방법 (다형성에 관한 모든 것)은 select type 구조를 사용하는 것입니다. 난 당신의 혼란의 한 부분을 해결하기 위해 선택 유형에 연관 이름을 사용했습니다

select type (assoc => num) 
type is (int) 
    Read (s, *, iostat=ios) assoc 
type is (real) 
    ... 
type is (...) 
class default 
    error stop "Oh noes!" 
end select 

: 간단하게하기 위해 목록을 지시하고 명시 적 형식의 경우를 무시합니다. 그냥

을 수행 한 경우
select type(num) 
type is (int) 
    Read (s, *, iostat=ios) num 
end select 

는 "지금 num을 사용하는 것은 괜찮 왜?"라고 생각하는 그 이유는 구성 내부의 num이 외부의 num과 같지 않기 때문입니다. 결정적인 것은 다형성이 아니지만 type is과 일치하는 정확한 유형입니다.