Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 在Fortran中选择类内的过程_Class_Fortran_Gfortran_Subroutine - Fatal编程技术网

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)