2012-03-23 50 views
3

目前在我的代码我有一个二维数组阵列派生类型:选定条目

integer, allocatable :: elements(:,:) 

,并定义一些常量

integer, parameter :: TYP = 1 
integer, parameter :: WIDTH = 2 
integer, parameter :: HEIGHT = 3 
! ... 
integer, parameter :: NUM_ENTRIES = 10 

和分配类似

allocate(elements(NUM_ENTRIES,10000)) 

所以我可以访问像

write(*,*) elements(WIDTH,100) ! gives the width of the 100th element 

现在我想不仅有整数,而且还有每个元素的混合类型。 所以我定义了一个派生类型

type Element 
    logical active 
    integer type 
    real width 
    ! etc 
end type 

和使用元素

type(Element), allocatable :: elements(:) 

阵列与2D阵列版本我可以调用一个子程序,告诉它使用哪个条目。 例如

subroutine find_average(entry, avg) 
    integer, intent(in) :: entry 
    real, intent(out) :: avg 
    integer i, 
    real s 

    s = 0 
    do i = lbound(elements,1), ubound(elements,1) 
     if (elements(TYP,i) .gt. 0) s = s + elements(entry,i) 
    end do 
    avg = s/(ubound(elements,1)-lbound(elements,1)) 
end subroutine  

所以,我可以call find_average(HEIGHT)找到的平均身高或通过WIDTH得到平均宽度。 (和我的子程序比找到平均高度或宽度做更高级的事情,这只是一个例子。)

问题:我如何使用不同的类型(与派生类型一样),但也重用我的函数来工作与不同的条目(如在示例子例程中)?

回答

4

对于数组而言,不是传入参数array和index i,而是传递单个参数数组(i)。当你切换到派生类型时,同样可以传入variable_of_type%元素,而不是传入整个variable_of_type,并以某种方式指示该子程序应该处理的子元素。如果代码对于不同类型的元素(例如,逻辑,整数,实数)需要不同,那么您可以为每个元素编写特定的过程,但通过通用接口块使用通用名称进行调用。编译器必须能够通过参数的某些特征(这里是它们的类型)区分通用接口块的过程。对于其中区别特征是阵列等级的代码示例,参见how to write wrapper for 'allocate'

编辑:示例代码。这是否做你想要的?

module my_subs 

    implicit none 

    interface my_sum 
     module procedure sum_real, sum_int 
    end interface my_sum 

contains 

subroutine sum_real (array, tot) 
    real, dimension(:), intent (in) :: array 
    real, intent (out) :: tot 
    integer :: i 

    tot = 1.0 
    do i=1, size (array) 
     tot = tot * array (i) 
    end do 
end subroutine sum_real 

subroutine sum_int (array, tot) 
    integer, dimension(:), intent (in) :: array 
    integer, intent (out) :: tot 
    integer :: i 

    tot = 0 
    do i=1, size (array) 
     tot = tot + array (i) 
    end do 
end subroutine sum_int 

end module my_subs 


program test_dt 

use my_subs 

implicit none 

type my_type 
    integer weight 
    real length 
end type my_type 

type (my_type), dimension (:), allocatable :: people 
type (my_type) :: answer 

allocate (people (2)) 

people (1) % weight = 1 
people (1) % length = 1.0 
people (2) % weight = 2 
people (2) % length = 2.0 

call my_sum (people (:) % weight, answer % weight) 
write (*, *) answer % weight 

call my_sum (people (:) % length, answer % length) 
write (*, *) answer % length 

end program test_dt 
+0

'entry'总是指向一个相同类型的条目(总是说'real'),所以幸运的是我不会有这个问题。但前两句话对我来说并不清楚。对于数组的情况下,你的意思是我可以给片'元素(WIDTH,:)'到函数?对于派生类型的情况,我不想要一个元素,我需要所有的元素。你可以追加我的示例函数的修改版本,所以我明白你的意思?谢谢 – 2012-03-23 23:17:33

+0

关于编辑:没有抱歉,这不是我想要的。 – 2012-03-24 14:01:08

+0

它传递用户定义类型的给定子项目的所有元素。如有必要,Fortran可以根据子项目的类型选择不同的过程。这与你想要做的有什么不同? – 2012-03-24 21:22:21