Fortran矩阵解码程序出现无限do循环问题,求故障排查指导
问题排查结果
- 核心无限循环原因:
Determinant自定义函数中存在无终止条件的do循环,进入该函数后会永远重复执行行列式计算逻辑,永远无法返回结果到主程序。 - 其余可优化/修复的代码问题:
- 行列式函数逻辑错误:计算得到的行列式值没有赋值给函数返回值
Determinant,即使去掉循环也无法返回正确结果 - 主程序循环逻辑不符合需求:注释要求循环步长为2,当前
do i = 2, 31默认步长为1,且每次直接覆盖Decoded_Message变量,最终只会保留最后一次解码的2个字符 - 动态数组使用冗余:不需要每次循环都执行
allocate/deallocate操作,直接使用固定大小的数组甚至临时整型变量即可完成计算 - 矩阵逆计算逻辑错误:2阶矩阵的逆为「伴随矩阵除以行列式」,当前代码写为乘以行列式,会导致解码结果完全错误
- 行列式函数逻辑错误:计算得到的行列式值没有赋值给函数返回值
修复后参考代码
implicit none integer :: M(2,2), MInv(2,2), Determinant, detM, i, v1, v2, asc1, asc2 character(len=32) :: Decoded_Message ! 读取编码矩阵 open(42,file='Data3.txt') read(42,*) M(1,1), M(1,2) read(42,*) M(2,1), M(2,2) ! 计算行列式 detM = determinant(M) ! 计算逆矩阵(伴随矩阵除以行列式) MInv(1,1) = M(2,2) / detM MInv(1,2) = -M(1,2) / detM MInv(2,1) = -M(2,1) / detM MInv(2,2) = M(1,1) / detM ! 初始化解码字符串 Decoded_Message = '' ! 步长为2循环读取解码 do i = 1, 31, 2 read(42,*) v1, v2 ! 矩阵乘法解码 asc1 = MInv(1,1)*v1 + MInv(1,2)*v2 asc2 = MInv(2,1)*v1 + MInv(2,2)*v2 ! 按位置拼接解码结果 Decoded_Message(i:i) = char(asc1) Decoded_Message(i+1:i+1) = char(asc2) end do ! 输出结果 print*, Decoded_Message close(42) end program Decode integer function Determinant(M) implicit none integer :: M(2,2), a, b, c, d ! 直接计算2阶行列式,删除无用循环 a = M(1,1) b = M(1,2) c = M(2,1) d = M(2,2) Determinant = (a*d)-(b*c) end function Determinant
内容的提问来源于stack exchange,提问作者Nik Wrye
相关产品推荐
相关产品推荐

