Fortran将过程保存为派生类型

时间:2015-12-08 22:28:34

标签: stored-procedures module fortran procedure derived-types

是否可以将过程存储为派生类型的属性?我在考虑以下几点:

  module funcs_mod
  public :: add
  contains
  function add(y,z) result (x)
    integer,intent(in) :: y,z
    integer :: x
    x = y + z
  end function
  end module

  module type_A_mod
  use funcs_mod
  public :: type_A,set_operator
  type type_A
    procedure(),pointer,nopass :: operator
  end type
  contains
  subroutine set_operator(A,operator)
    external :: operator
    type(type_A),intent(inout) :: A
    A%operator => operator
  end subroutine
  function operate(A,y,z) result(x)
    type(type_A),intent(in) :: A
    integer,intent(in) :: y,z
    integer :: x
    x = A%operator(y,z)
  end function
  end module

  program test
  use type_A_mod
  use funcs_mod
  type(type_A) :: A
  call set_operator(A,add)
  write(*,*) operate(A,1,2)
  end program

但这没有成功编译。显示了几个错误,包括:

1)过程指针组件中的语法错误

2)(1)的'operator'不是'type_a'结构的成员

以及一些不成功的使用声明。有没有办法正确地做到这一点?非常感谢任何帮助。

更新

我已将procedure,pointer修改为procedure(),pointer,现在错误是

1)FUNCTION属性与'operator'

中的SUBROUTINE属性冲突

2)无法将UNKNOWN转换为INTEGER(4)

两者都引用行x = A%operator(y,z)

1 个答案:

答案 0 :(得分:1)

正如您所发现的,声明过程指针声明的语法需要procedure([interface]), pointer [, ...] :: ...。您选择了procedure(), pointer, nopass :: operator

procedure()的结果是你没有声明operator是函数还是子例程。在这方面没有什么不妥之处,但更多的工作仍然是说服编译器你一直在使用引用。你的编译器似乎不相信你。

我不会详细讨论编译器的意思,而是采用不同的方法。

您引用A%operator作为函数A的结果的operate类型的结构A%operator。你在声明后一个函数时说得很清楚,结果是整数。

现在,假设您不希望使用类型/种类转换进行令人兴奋的事情来获得整数结果,我们将采取您始终打算使type type_A procedure(integer),pointer,nopass :: operator end type 成为具有整数结果的函数。这意味着您可以将该过程指针组件声明为具有整数结果的函数。

这仍然让您有选择:

type type_A
  procedure(add),pointer,nopass :: operator
end type

是具有整数结果和隐式接口的函数,

add

是一个具有与函数implicit none匹配的显式接口的函数。

您正在进行的设计选择将为您做出最终决定。

最后请注意,您没有使用external :: operator 。当我们考虑您的行

时,这很重要
operator

如果integer, external :: operator 是一个函数,那么(通过隐式类型规则)它具有(默认)实际结果。因此,您想要更改为以下之一

procedure(integer) :: operator

procedure(add) :: operator

operate

总结一下,并回应弗拉基米尔F的评论,仔细考虑你的设计。您目前有来自procedure(add)(在函数结果及其参数中)的引用的约束,看起来您确实知道该组件将具有特定的接口。如果您确定,请使用$(document).ready(function(){ var rowHeight = 50; var marginBottom = 50; var nrOfRows = 0; $('.my-table .row').each(function(){ nrOfRows ++ }) var panelHeight = (rowHeight*nrOfRows)+prseInt(marginBottom) }) 作为声明/