Fortran克莱姆法则代码编译报错:显式接口与参数类型不匹配求助
Fortran实现克莱姆法则编译报错解决方案
报错信息汇总
编译时触发两类报错:
- ColumnInsert子程序调用报错
103 | call ColumnInsert(M(n,n), b, n, col, MatOut(n,n)) | 1 Error: Explicit interface required for ‘columninsert’ at (1): assumed-shape argument
- Determinant函数调用报错
107 | detA = Determinant (MatOut(:,:), n) | 1 Error: Type mismatch in argument ‘m’ at (1); passed INTEGER(4) to REAL(8)
核心修复点
1. 解决显式接口报错
Fortran中调用带假定形状参数(如(:,:)后缀的数组)的子程序时,调用方必须能够获取子程序的显式接口,修复方法:
在主程序CramersRule的end program语句前添加contains关键字,将Cramer、ColumnInsert、Determinant三个子程序全部放到contains之后,主程序就能直接识别所有子程序的接口。
2. 解决类型不匹配报错
Cramer子程序中定义的临时矩阵MatOut类型错误:
原代码:
integer :: MatOut(n,n)
修改为:
real*8 :: MatOut(n,n)
与Determinant函数要求的real*8类型入参匹配。
3. 其他关联错误修复
- 传参错误:第一次调用
ColumnInsert时M(n,n)、MatOut(n,n)写法仅传递单个矩阵元素,需改为传递整个数组,修改为call ColumnInsert(M, b, n, col, MatOut) - 维度不匹配:
ColumnInsert子程序中入参b定义为二维数组b(1,n),实际传入的是一维向量,修改定义为double precision :: M(n,n), b(n) - 结果未输出:
Cramer子程序中计算得到的solution1/solution2/solution3未赋值给输出参数x,需补充x(1)=solution1; x(2)=solution2(n=2场景)、x(1)=solution1; x(2)=solution2; x(3)=solution3(n=3场景) - 内存重复释放:删除
Cramer子程序末尾的deallocate(M, b, x)语句,上述数组由主程序分配,无需在子程序中释放,避免后续主程序释放时触发内存错误。
内容的提问来源于stack exchange,提问作者Nik Wrye
相关产品推荐
相关产品推荐

