如何指定取决于变量的数据类型来执行程序(How to specify procedures to b

2019-09-19 17:09发布

我正在写访问的图像和读取的像素值的模块。 在图像中的值通常是不同的数据类型(是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

我现在的问题:有没有一种可能,该程序会自动查找取决于图像的数据类型相应的程序(存储在可变image%datatype )? 例如,如果数据类型为整数,则子程序pxvalues_integer被执行期间调用image%pxvalues

谢谢!

Answer 1:

如果您不愿意更改代码的结构,然后通过bdforbes提出的SELECT CASE方法是一种选择。

除此之外,您可以使用多态和各种不同类型的同父类型的所有扩展替换数据类型的组件。 这就是为什么类型绑定程序(程序语句的类型定义中包含后)存在的根本原因,所以你还不如把它们作为意!

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)

有此方法需要您的代码比在孤立的例子片断被赋予更多的知识的含义。



Answer 2:

如何具有实际过程pxvalues是这样的:

subroutine pxvalues(this)
    select case (this%datatype)
    case (0)
        call this%pxvalues_integer
    case (1)
        call this%pxvalues_real
    end select
end subroutine


Answer 3:

如果pxvalues是与接口定义的模块过程中,你可以做到以下几点:

interface pxvalues ; module procedure &
    pxvalues_integer , &
    pxvalues_real
end interface


文章来源: How to specify procedures to be executed depending on data type of variable