2017-11-13 19 views
0

use module, ONLY: 문을 사용하여 모듈간에 파생 데이터 유형 (변수가 아닌 유형)을 포함하는 방법은 무엇입니까?정의 전에 사용 된 포트란 파생 데이터 유형

내 설명 : 내 module1에서이 데이터 형식의 파생 데이터 형식 (my_datatype이라고 부름)과 일부 데이터 (my_data라고 부름)를 정의했습니다. 내 module2에서 my_data을 사용해야합니다. 내 모듈 1에는 module2이 필요하지 않은 많은 절차가 들어 있기 때문에 my_data 만 포함하려면 ONLY 문을 사용하고 싶습니다. 내가 그것을 통과하지 않았기 때문에 module2module1에 정의 my_datatype을 인식하지 못하는 것은 분명하다

Derive datatype 'my_type' is used before defined at "type(my_type),intent(out)::A" 

: 그러나, 데이터 유형을 포함하지 않고 그것은 나에게 오류를 제공 할 것입니다. 그러나 파생 된 유형을 '모듈 만 사용'문에 포함시키는 구문은 무엇입니까? 나는 그래, 포트란 2003

module step1 
    implicit none 
    type my_type 
     integer::id 
     integer,dimension(2)::my_data 
    end type my_type 

    type(my_type)::A 
    end module step1 

    module step2 
    use step1,only:A 
    implicit none 
    contains 
    subroutine change_A(A)    
     type(my_type),intent(inout)::A 
     A%id = 1 
     A%my_data(1) = 1 
     A%my_data(2) = 2      
    end subroutine change_A 
    end module step2 

    program test 
    ! program is in a different folder 
    use step1 
    use step2 
    implicit none 
    call change_A(A) 
    end program test 
+1

환영합니다. 귀하의 질문에 * 실제 코드 *를 게시하십시오. 특히 오류 메시지를 표시 할 때 그렇게하십시오. 또한 * complete * 오류 메시지를 표시하십시오. [ask] 및 [mcve]를 참조하십시오. 난센스를 제거하고'my_data % i = 1'을'do_something_to_my_data'에 추가하면 여러분이 보여주는 코드가 잘 컴파일됩니다. 변수로 작업하려면 범위에 데이터 유형이 필요하지 않습니다. –

+0

블라디미르 감사합니다. 제안 된대로 질문을 수정했습니다. –

답변

2

However, it is giving me error "derived datatype is used before it is defined". It looks like module2 does not recognize my_datatype defined in module1.

잘 사용하고 있습니다. 물론 module2는 모듈 1에 정의되어 있고 use_- 문에 my_data 변수 만 사용하기 때문에 데이터 유형을 인식하지 못합니다.

(편집 : 다음에서 구현 제안 단순히 'use' 문에서 데이터 유형을 포함하고,이 업데이트 된 질문을 감안할 때 모듈 2

+0

빠른 답변 주셔서 감사합니다. "use"문에 데이터 유형을 사용하는 구문을 보여 주시겠습니까? 나는 그것을 발견 할 수 없었다. –

+0

변수 이름과 완전히 같습니다. –

0

에 알려진 것입니다, 여기에 다른 사람에 의해 제안 된 수정 프로그램을 구현하는 방법입니다 의견 :..

  1. 만 모듈 2 단계에서 모듈 1 단계에서 유형을 가져
  2. 메인 프로그램에서 2 단계에서 1 단계와 change_A에서
  3. 만 수입 A를
  4. 주의 걸릴 말라 더미 인수 "A"에서 루틴 "변경 _A "는 루틴의 정의에서 모듈 step1의"A "와 아무런 관련이 없습니다. 이 점을 설명하기 위해 더미의 이름을 바꿉니다.

는)

module step1 
    implicit none 
    type my_type 
    integer::id 
    integer,dimension(2)::my_data 
    end type my_type 

    type(my_type)::A 

end module step1 

module step2 
    use step1, only: my_type 
    implicit none 
contains 
    subroutine change_A(dummy) 
    type(my_type),intent(inout) :: dummy 
    dummy%id = 1 
    dummy%my_data(1) = 1 
    dummy%my_data(2) = 2 
    end subroutine change_A 
end module step2 

program test 
    ! program is in a different folder 
    use step1, only: A 
    use step2, only: change_A 
    implicit none 

    call change_A(A) 
    write(*,*) A 

end program test 

나는 '사용'문 my_type 추가했습니다.

+0

서브 루틴의 'A'가 모듈 엔티티가 아니라는 것이 명시 적으로 가치 있다고 생각합니다. – francescalus

+0

예,'only' 절의 A는 거의 아무것도하지 않습니다. –