是否可以将过程存储为派生类型的属性?我在考虑以下几点:
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)
答案 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)
})
作为声明/