You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带参数化派生类型的类型绑定过程编译报错求助

解决参数化派生类型绑定过程的GCC编译错误

先来看你遇到的编译错误:Error: Argument of with PASS(sh) at (1) must be of the derived-type,这个问题出在类型绑定子程序ciao对参数化派生类型的多态引用写法上,具体原因和修正方法如下:

错误原因分析

在定义参数化派生类型的类型绑定过程时,你在子程序ciao中写了:

class (vector(KIND(4),ndim)) :: sh

这里有两个核心问题:

  1. ndim是类型的长度参数,但在子程序的作用域里并没有被声明,编译器无法识别它的具体值;
  2. 对于多态的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

额外补充说明

  1. 如果需要让ciao适配任意种类、任意长度的vector对象,可以把class声明改成:
    class(vector(:,:)) :: sh
    
    同样可以通过sh%k获取对象的种类参数,sh%ndim获取长度参数;
  2. 原主程序中缺少对绑定过程ciao的调用,记得要声明对应的变量并显式调用;
  3. 派生类型直接使用write(*,*)输出时,部分编译器可能仅输出类型元数据而非数组内容,建议直接指定输出数组元素。

内容的提问来源于stack exchange,提问作者Giuliano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:57:34