2014-11-06 15 views
0

파생 된 데이터 형식의 필드로 서브 루틴의 입력을 어떻게 전달합니까?포트란 형식의 필드를 서브 루틴의 입력으로

나는 골짜기를 반복 할 연결 목록이 있는데 특정 필드에서만 작업하고 싶지만 다른 필드에서 같은 기능을 호출 할 수 있도록 "이름"필드를 입력으로하고 싶습니다. 목록의. 예를 들어

: 그것은 동일한 이름과 정의를 가지고 있지만 두 곳에서 유형을 정의하면 포트란 표준에 따르면

program main 

implicit none 

! ----- variables declaration 


type :: element 
    real      :: u1 
    real      :: u2 
    type (element), pointer :: next => null() 
end type element 

type (element), pointer  :: first, last, iele 

! ----- code 

allocate(first) 
last => first 
first %u1 = 0 
first %u2 = 0 
allocate(first %next) 
last => first %next 
last %u1 = 10 
last %u2 = 20 

call addten(u1, first) 
call addten(u2, first) 

iele => first 
do while (associated(iele)) 
    write(*,*) iele %u1 
    iele => iele %next 
end do 


end program main 

! ===== 

subroutine addten(u, first) 

implicit none 

! ----- variables declaration 

type :: element 
    real      :: u1 
    real      :: u2 
    type (element), pointer :: next => null() 
end type element 

real, pointer     :: u 
type (element), pointer  :: iele 

! ----- code 

iele => first 
do while (associated(iele)) 
    iele %u = iele %u + 10 
    iele => iele %next 
end do 


end subroutine addten 

답변

1

, 그것은 하지 동일한 유형입니다. 프로 시저를 내부적으로 을 사용하거나 형식을 정의한 place it in a module을 사용하여 내부로 만들어야합니다.

링크 된 목록을 이동하려는 경우

, 먼저 전체 변수를 전달하려는 SOU하지만 포인터로 메이비 : 당신은에

type(element), pointer, intent(in) :: first 

당신이 알고 있어야 그 후 변경되는 구성 요소 수 브린.

integer, intent(in) :: comp 

    select case (comp) 
    case (1) 
     !add to component u1 
    case (2) 
     !add to component u2 
    end select 

은 그래서 (테스트하지)처럼 보일 수 있습니다 :

module list 
    implicit none 

    type :: element 
    real      :: u1 
    real      :: u2 
    type (element), pointer :: next => null() 
    end type element 

!here any other subroutines directly connected to the list object 

end module list 


module other_list_procedures 
    use list 

    implicit none 

    subroutine addten(comp, first) 
    type (element), pointer, intent(in) :: first 
    integer, intent(in) :: comp 
    type (element), pointer  :: iele 

    iele => first 
    do while (associated(iele)) 
     select case (comp) 
     case (1) 
      iele%u1 = iele%u1 + 10 
     case (2) 
      iele%u2 = iele%u2 + 10 
     end select  

     iele => iele%next 
    end do 


    end subroutine addten 

end module 
+0

좋은 지적 그것은 직접 정보를 전달 할 수 없습니다, 당신은 당신의 서브 루틴이 스위치로 이해하고 일부 보조 변수를 전달해야 그는 모듈에 관해서, 내 것이 엉성한 예제였습니다. 큰 코드 덩어리를 본질적으로 복제하고 싶지 않기 때문에 스위치 나 선택을 피하고 싶었습니다. +10 연산은 한 줄이지만 실제 코드는 여러 줄입니다. –

+0

@GiacomoCastiglioni 내가 아는 다른 가능성은 없습니다. –