2014-11-06 58 views
0

我如何將派生數據類型的字段作爲輸入傳遞給子例程?Fortran類型字段作爲子例程中的輸入

我有一個鏈接列表,我想循環低谷,我只想在特定字段上工作,但我想將字段「名稱」作爲輸入,以便我可以在不同的字段上調用相同的函數的名單。

例如:

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

據,如果你在兩個地方定義類型Fortran標準,它是不是同一類型儘管它具有相同的名稱和定義。您必須使用contains或更好的place it in a module使程序內部使用,您可以在其中定義類型。

在你的情況,你想通過鏈表,SOU你想先通過全局變量,但人工養殖作爲指針:

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

這之後,你必須知道你在改變其成分soubrutine。這是不可能直接傳遞這些信息,你需要通過你的子程序理解爲一個開關一些輔助變量:

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操作是一行,而對於我的真實代碼,它將是幾行。 – 2014-11-07 03:09:17

+0

@GiacomoCastiglioni我沒有意識到其他可能性。 – 2014-11-07 07:09:16

相關問題