带参数化派生类型的类型绑定过程编译报错求助
解决参数化派生类型绑定过程的GCC编译错误
先来看你遇到的编译错误:Error: Argument of with PASS(sh) at (1) must be of the derived-type,这个问题出在类型绑定子程序ciao对参数化派生类型的多态引用写法上,具体原因和修正方法如下:
错误原因分析
在定义参数化派生类型的类型绑定过程时,你在子程序ciao中写了:
class (vector(KIND(4),ndim)) :: sh
这里有两个核心问题:
ndim是类型的长度参数,但在子程序的作用域里并没有被声明,编译器无法识别它的具体值;- 对于多态的
class引用,参数化类型的可变参数(比如这里的ndim)需要用**延迟参数标记(冒号:)**来表示它会适配调用该过程的具体对象的参数值,而不是直接写一个未定义的变量名。
修正后的完整代码
下面是修复后的模块和主程序,同时补充了一些细节优化:
module mat implicit none type vector(k, ndim) integer, kind :: k = KIND(4) integer, len :: ndim real(kind = k), dimension(ndim) :: v contains procedure :: ciao end type vector contains subroutine ciao(sh,a) class(vector(KIND(4), :)) :: sh ! 用冒号适配任意ndim长度参数 real(kind=8) :: a ! 如需使用维度值,可直接通过sh%ndim获取对象的实际长度参数 print *, "当前vector的维度:", sh%ndim a = 1d0 end subroutine ciao end module mat !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! program test use mat real(kind=8) :: a ! 声明绑定过程需要的变量a type( vector(4,10) ) :: A A%v(1) = 1d0 A%v(2) = 2d0 A%v(3) = 3d0 call A%ciao(a) ! 调用类型绑定过程 ! 直接输出派生类型可能仅显示元数据,建议输出数组元素 write(*,*) "vector前3个元素:", A%v(1:3) end program test
额外补充说明
- 如果需要让
ciao适配任意种类、任意长度的vector对象,可以把class声明改成:
同样可以通过class(vector(:,:)) :: shsh%k获取对象的种类参数,sh%ndim获取长度参数; - 原主程序中缺少对绑定过程
ciao的调用,记得要声明对应的变量并显式调用; - 派生类型直接使用
write(*,*)输出时,部分编译器可能仅输出类型元数据而非数组内容,建议直接指定输出数组元素。
内容的提问来源于stack exchange,提问作者Giuliano
相关产品推荐
相关产品推荐

