2

画像にアクセスしてピクセル値を読み取るモジュールを作成しています。通常、イメージ内の値はさまざまなデータ型 ( integer(2)integer(4)、...) です。これまで、型imageは次のように定義されていました。

type, public :: image
  logical        :: initialized   = .false.
  character(256) :: path          = ""      ! Path to image
  integer        :: dimensions(3) = -1      ! Dimensions of image
  integer        :: datatype      = 0       ! Datatype
  contains
    procedure :: initialize
    procedure :: pxvalues
    procedure :: getMeta
end type image

私の質問: 画像のデータ型 ( variable に格納されているimage%datatype) に応じて、プログラムが対応する手順を自動的に見つける可能性はありますか? たとえば、データ型が整数の場合、サブルーチンpxvalues_integerは の実行中に呼び出されimage%pxvaluesます。

ありがとう!

4

3 に答える 3

2

コードの構造を変更したくない場合は、bdforbesによって提案されたSELECTCASEアプローチがオプションです。

それを超えると、ポリモーフィズムを使用して、データ型コンポーネントを、すべて同じ親型の拡張である異なる型に置き換えることができる場合があります。これが、型にバインドされたプロシージャ(型定義のcontainsの後のプロシージャステートメント)が存在する根本的な理由です。したがって、意図したとおりに使用することをお勧めします。

type, public, abstract :: image
  ! Common components to all extensions
  logical        :: initialized   = .false.
  character(256) :: path          = ""      ! Path to image
  integer        :: dimensions(3) = -1      ! Dimensions of image
  contains
    procedure :: initialize
    ! Abstract interface pxvalues_image specified what the interface must
    ! look like.  Deferred attribute means that extensions of image 
    ! must specify a specific procedure for the pxvalues binding.  All 
    ! specific procedures must have the same interface bar the passed 
    ! argument.
    procedure(pxvalues_image), deferred :: pxvalues
    procedure :: getMeta
end type image

abstract interface
  subroutine pxvalues_image(obj, ...)
    import :: image
    class(image), intent(in) :: obj
    ...
  end subroutine pxvalues_image
end interface

! A type for images that have integer2 data.
type, public, extends(image) :: image_integer2
  contains
    procedure :: pxvalues => pxvalues_integer2
end type image_integer2

! A type for images that have integer4 data.
type, public, extends(image) :: image_integer4
  contains
    procedure :: pxvalues => pxvalues_integer4
end type image_integer4

次に、特定のプロシージャ'' pxvalues_integer2''、'' pxvalues_integer4''などが、拡張タイプの初期引数を取ります。

データ型コンポーネントを設定するのではなく、最初の「画像」オブジェクトを作成するコードは、代わりに画像の適切な拡張子としてオブジェクトを作成する必要があります。

subroutine create_image(object)
  class(image), intent(out), allocatable :: object
  ...
  ! We want an image that for integer2's
  allocate(image_integer2 :: object)

このアプローチには、孤立したサンプルスニペットで提供できるよりも多くのコードの知識が必要な意味があります。

于 2012-07-19T21:20:13.827 に答える
1

pxvalues次のような実際の手順はどうですか。

subroutine pxvalues(this)
    select case (this%datatype)
    case (0)
        call this%pxvalues_integer
    case (1)
        call this%pxvalues_real
    end select
end subroutine
于 2012-07-18T23:09:13.703 に答える
0

pxvalues がインターフェイスで定義されたモジュール プロシージャである場合、次の操作を実行できます。

interface pxvalues ; module procedure &
    pxvalues_integer , &
    pxvalues_real
end interface
于 2012-07-19T00:24:28.650 に答える