Fortran能否基于参数数量重载类型绑定的procedure?
问题根因
你的代码报错是因为Fortran的类型绑定重载语法使用错误,并非Fortran不支持该功能。你当前直接在procedure语句后挂载多个过程的写法,只会将init绑定到第一个过程panel_init_3,自然调用时传4个参数会报参数数量不匹配的错误。
正确实现方式
要实现同一绑定名根据参数数量重载,需要在类型定义中用generic语句声明通用绑定接口,再把对应的具体实现过程声明为类型的绑定过程即可,完全符合Fortran 2003及以后的标准,gfortran 9.3.0完全支持该特性。
修改后的panel类型定义如下:
type panel ! A panel with an arbitrary number of sides integer :: N ! Number of sides/vertices type(vertex_pointer),dimension(:),allocatable :: vertices real,dimension(3) :: n_hat ! Normal vector real :: A ! Surface area contains ! 声明通用绑定接口init,关联两个不同参数的实现 generic :: init => panel_init_3, panel_init_4 ! 声明两个初始化过程为类型绑定过程,加private是避免外部直接调用具体实现,不需要可以去掉 procedure,private :: panel_init_3, panel_init_4 procedure :: calc_area => panel_calc_area ! 修复原代码中calc_normal绑定到面积计算过程的错误 procedure :: calc_normal => panel_calc_normal end type panel
后续使用说明
修改完成后你原有的调用代码不需要做任何调整,编译器会自动根据传入的参数数量匹配对应的初始化子程序,完全符合你想要的简洁写法。
内容的提问来源于stack exchange,提问作者byl
相关产品推荐
相关产品推荐

