2012-03-23 10 views
3

を選択し、私は2次元配列配列:現在、私のコードにエントリー

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)) 

のようなものを割り当てるI

などの要素にアクセスできます

ここでは、整数だけでなく、すべての要素にタイプの混合が必要です。 だから私は、派生型

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

を定義し、私が使用するエントリにそれを伝えるサブルーチンを呼び出すことができ、2D配列バージョンを持つ要素

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

の配列を使用します。 など。

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

配列の場合、arguments配列とindex iを渡す代わりに、単一引数配列(i)を渡すことができます。派生型を持つように切り替えると、同様に、variable_of_type全体を渡すのではなく、それが処理されるべきサブ要素のプロシージャに何らかの方法で指示するのではなく、variable_of_type%要素を渡すことができます。異なるタイプの要素(たとえば、論理、整数、実数)ごとにコードを変更する必要がある場合は、それぞれに固有の手順を記述できますが、一般的なインターフェイスブロックを介して共通名で呼び出します。コンパイラは、汎用インタフェースブロックの手続きを引数の特性(ここではその型)で区別することができなければなりません。識別特性が配列ランクであるコード例については、how to write wrapper for 'allocate'

EDITを参照してください。これはあなたが望むことをしますか?

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')。だから幸いにもこの問題はありません。しかし、最初の2つの文章は私には分かりません。配列の場合、スライスに 'elements(WIDTH、:)'を渡すことができるのですか?派生型の場合、私は1つの要素を必要としません、私はすべての要素が必要です。私のサンプル関数の修正版を追加できますか?私はあなたが意味することを理解していますか?ありがとうございます –

+0

編集:いいえ申し訳ありませんが、これは私が欲しいものではありません。 –

+0

ユーザー定義型の指定されたサブ項目のすべての要素を渡しています。必要に応じて、Fortranはサブ項目のタイプに応じて異なるプロシージャを選択できます。これはあなたがしたいこととどのように違うのですか? –

関連する問題