Class 在Fortran中选择类内的过程
我们如何在类中选择过程?编译错误是:Class 在Fortran中选择类内的过程,class,fortran,gfortran,subroutine,Class,Fortran,Gfortran,Subroutine,我们如何在类中选择过程?编译错误是: $ gfortran -Wall -Wextra -Wconversion -Og -pedantic -fcheck=bounds -fbacktrace -g -fmax-errors=5 driver.f08 driver.f08:60:39: call sub ( me, myMeasurements ) 1 Error: More actual
$ gfortran -Wall -Wextra -Wconversion -Og -pedantic -fcheck=bounds -fbacktrace -g -fmax-errors=5 driver.f08
driver.f08:60:39:
call sub ( me, myMeasurements )
1
Error: More actual than formal arguments in procedure call at (1)
出现在模块mIntermediates
(第28行)内的子例程本地选择器子例程(第48行)中。参数sub
将是compute\u intermediates\u dot
或compute\u intermediates\u sum
MWE代码驱动程序。f08
尝试选择计算路径。对两个选项的调用,compute\u intermediates\u sum
和compute\u intermediates\u dot
都有效(第93、94行)
问题在于调用包含目标计算路径名称的local\u selector
(第95行)。目标是有不同的表现形式,例如
调用myIntermediates%local\u选择器(compute\u intermediates\u sum,myMeasurements)
或
调用myIntermediates%本地选择器(计算\u intermediates\u点,MyMeasures)
MWE:
版本:
GNU Fortran(GCC)5.1.0
子例程local\u selector\u sub
中的伪过程。该接口
interface
subroutine sub
end subroutine sub
end interface
(当冗余的use
和import
以及未使用的通用名被删除时)表示sub
没有参数。在下面的调用中,您尝试给它两个参数,编译器对此提出了正确的抱怨
要解决这个问题,您需要正确指定接口(或依赖隐式接口)。我注意到,两个选项compute\u intermediates\u dot\u sub
和compute\u intermediates\u sum\u sub
都具有您可以编写的相同特性,例如
subroutine local_selector_sub ( me, sub, myMeasurements ) ! problematic routine
class ( intermediates ), target :: me
type ( measurements ), intent ( in ) :: myMeasurements
procedure(compute_intermediates_dot_sub) sub
call sub ( me, myMeasurements )
end subroutine
(或者您可以创建一个中性命名的抽象接口或使用适当的接口块)
但这引出了一个更有趣的问题:
call myIntermediates%local_selector(compute_intermediates_dot, myMeasurements)
compute\u intermediates\u dot
不是子例程。它是类型为intermediates
的类型绑定过程的绑定名称
如果您希望将子例程传递给myIntermediates%local\u selector
,最简单的解决方案是使子例程compute\u intermediates\u dot\u sub
自身可访问/公开并传递该子例程。但我会坚持在另外两行中做出选择
可选地,如果您真的想选择一个子程序传递给<代码> MyMealTase%LoalAlxS选择器< /代码>,那么您可以考虑使用过程指针组件而不是绑定类型的程序。
call myIntermediates%local_selector(compute_intermediates_dot, myMeasurements)