FreePascal程序运行报错exit code 201,请求调试解决
问题描述
我编写的热传导模拟FreePascal程序可正常编译,但运行时报错exit code 201。需求为设置N=11、dtmax=0.0003,分别测试M=11、21、41、61的情况。尝试通过常量定义及在writeln语句中指定参数值均无效,已将integer类型改为Longint仍未解决问题,运行时窗口闪退还无法查看内容。程序代码如下:
uses crt, printer; const N = 11; {radial nodes} M = 21; {axial nodes} k = 40.0; {thermal conductivity (W/mK)} alpha = 1e-5; {thermal diffusivity (m^2/s)} Rs = 0.025; {disk radius (m)} Zs = 0.005; {disk thickness (m)} qmax = 3.0e6; {peak flux (W/m^2)} Ro = 0.05; {parameter in flux equation (m)} Tinit = 20.0; {initial temperature (C)} Tmax = 300.0; {maximum desired temperature at top of axis (C)} var dr, dz, rhoC, dtMax, dt, time : real; i, j : Longint; C, R, L, U, D : array [1..N,1..M] of real; q, V, Aco, Aci, Af : array [1..N] of real; Told, Tnew : array [1..N+1,1..M+1] of real; begin {Size of the control volumes} dr := Rs/(N - 1); dz := Zs/(M - 1); rhoC:= k/alpha; {Control volume surface areas and volumes} Af[1] := pi*dr*dr/4.0; Af[N] := pi*dr*(Rs - dr/4.0); for i := 2 to N - 1 do Af[i] := 2.0*pi*dr*dr*(i - 1); for i := 1 to N do V[i] := Af[i]*dz; Aco[N] := 2.0*pi*Rs*dz; for i := 1 to N - 1 do Aco[i] := 2.0*pi*dr*dz*(i - 0.5); Aci[1] := 0.0; for i := 2 to N do Aci[i] := 2.0*pi*dr*dz*(i - 1.5); {Absorbed flux as function of i} q [1] := pi/4.0*qmax*dr*dr*(1.0 - 0.9/8.0*sqr(dr/Ro)); q [N] := pi*qmax*dr*dr*(N - 1.25-0.9/8.0*sqr(dr/Ro)*(2.0*N*N*N -7.5*N*N + 9.5*N - 65.0/16.0)); for i := 2 to N - 1 do q [i] := pi*qmax*dr*dr*(2.0*(1 - 1.0) - 0.9/4.0*sqr(dr/Ro)*(4.0*i*i*i - 12.0*i* i + 13.0*i - 5.0)); {Coefficient matrices} for i := 1 to N do for j := 1 to M do begin R[i, j] := 0.0; L[i, j] := 0.0; U[i, j] := 0.0; D[i, j] := 0.0; C[i, j] := 0.0; end; For i := 2 to N - 1 do For j := 2 to M - 1 do begin; R[i, j] := Aco[i]/dr; L[i, j] := Aci[i]/dr; U[i, j] := Af[i]/dz; D[i, j] := Af[i]/dz; end; i := 1; for j := 2 to M - 1 do begin R[i, j] := Aco[i]/dr; U[i, j] := Af[i]/dz; D[i, j] := Af[i]/dz; end; i := 1; j := M; R[i, j] := Aco[i]/dr; D[i, j] := Af[i]/dz; i := 1; j := 1; R[i, j] := Aco[i]/dr; U[i, j] := Af[i]/dz; i := N; for j := 2 to M - 1 do begin L[i, j] := Aci[i]/dr; U[i, j] := Af[i]/dz; D[i, j] := Af[i]/dz; end; i := N; j := M; L[i, j] := Aci[i]/dr; D[i, j] := Af[i]/dz; i := N; j := 1; L[i, j] := Aci[i]/dr; U[i, j] := Af[i]/dz; j := M; for I := 2 to N - 1 do begin R[i, j] := Aco[i]/dr; L[i, j] := Aci[i]/dr; D [i, j] := Af[i]/dz; end; j := 1; for I := 2 to N - 1 do begin R [i, j] := Aco[i]/dr; L [i, j] := Aci[i]/dr; U [i, j] := Af[i]/dz; end; {Maximum permissible dt} dtMax := 0.0; for i := 1 to N do for j := 1 to M do begin dt := V[i]/alpha/(R[i, j] + L[i, j] + U[i, j] + D[i, j]); if dt > dtMax then dtMax := dt; end; dt := 0.5*dtMax; {actual value} {fill in the cij matrix} for i := 1 to N do C[1, M] := dt*q [i]/rhoC/V[i]; {Initial conditions} for i := 1 to N do for j := 1 to M do Told [i, j] := Tinit; {carry out the solution} time := 0.0; repeat time:= time + dt; writeln (time: 10:5); for i:= 1 to N do for j:= 1 to M do Tnew [i,j] := Told [i,j]*(1.0 - alpha*dt/V[i]*(R[i,j]+ L[i,j]+ U[i,j]+ D[i,j]) + alpha*dt/V[i]*(R[i, j]*Told [i + 1, j] + L[i, j]*Told [i - 1, j] + U[i, j]*Told [i, j + 1] + D[i, j]*Told [i, j - 1]) + C[i, j]); if Tnew[1,m] > Tmax then {print out distribution and quit} begin writeln(11, time : 8 : 4, 'sec dt =', dt : 15 : 10); write(11,' '); for i := 1 to N do write (11, 1 : 10); writeln(11); for j := M downto 1 do begin write(11, j : 4); for i := 1 to N do write(11, Tnew[i,j]: 10 : 5); writeln(11); end; writeln(11); halt; end; for i := 1 to N do for j := 1 to M do Told[i, j]:= Tnew[i, j]; until time < - 1.0; end.
问题分析与修复方案
1. Exit Code 201(浮点除以零错误)
- 原因:计算
dt时,R[i,j]+L[i,j]+U[i,j]+D[i,j]可能为0,触发除以零操作;部分边界位置的系数矩阵未正确赋值。 - 修复:
- 计算
dt前增加判断,避免除以零:if (R[i,j] + L[i,j] + U[i,j] + D[i,j]) > 1e-10 then begin dt := V[i]/alpha/(R[i,j] + L[i,j] + U[i,j] + D[i,j]); if dt > dtMax then dtMax := dt; end; - 检查系数矩阵初始化逻辑,确保所有
i,j位置的系数都被正确赋值,无遗漏。
- 计算
2. 数组越界访问
- 原因:计算
Tnew时,i=1会访问Told[0,j],j=1会访问Told[i,0],均超出数组定义范围,触发内存访问错误。 - 修复:针对边界位置单独处理,跳过越界项的计算:
for i:= 1 to N do for j:= 1 to M do begin Tnew[i,j] := Told[i,j] * (1.0 - alpha*dt/V[i]*(R[i,j]+L[i,j]+U[i,j]+D[i,j])); // 处理右侧项(i+1) if i < N then Tnew[i,j] := Tnew[i,j] + alpha*dt/V[i] * R[i,j] * Told[i+1,j]; // 处理左侧项(i-1) if i > 1 then Tnew[i,j] := Tnew[i,j] + alpha*dt/V[i] * L[i,j] * Told[i-1,j]; // 处理上侧项(j+1) if j < M then Tnew[i,j] := Tnew[i,j] + alpha*dt/V[i] * U[i,j] * Told[i,j+1]; // 处理下侧项(j-1) if j > 1 then Tnew[i,j] := Tnew[i,j] + alpha*dt/V[i] * D[i,j] * Told[i,j-1]; // 加入源项 Tnew[i,j] := Tnew[i,j] + C[i,j]; end;
3. 代码语法与逻辑错误
- q数组赋值换行错误:原代码中
q[i]的赋值语句被错误拆分,修复为完整语句:for i := 2 to N - 1 do q[i] := pi*qmax*dr*dr*(2.0*(1 - 1.0) - 0.9/4.0*sqr(dr/Ro)*(4.0*i*i*i - 12.0*i*i + 13.0*i - 5.0)); - 循环变量大小写不一致:将所有循环变量统一为小写
i,替换大写I。 - C矩阵赋值逻辑错误:原循环中所有
i都赋值给C[1,M],应改为赋值给C[i,M]:for i := 1 to N do C[i, M] := dt*q[i]/rhoC/V[i]; - 条件判断变量大小写错误:将
Tnew[1,m]改为Tnew[1,M],保持与常量定义一致。 - 无限循环问题:原
until time < -1.0永远无法满足,改为until (Tnew[1,M] > Tmax) or (time > 10.0)(10.0为示例最大时间限制)。
4. 窗口闪退与输出问题
- 输出目标错误:原代码中
writeln(11,...)是输出到打印机,改为直接输出到控制台,去掉文件号11。 - 程序结束后暂停:在程序末尾添加
readln;,防止窗口直接关闭。
修复后的完整代码
uses crt; // 移除printer单元,避免不必要的依赖 const N = 11; {radial nodes} M = 21; {axial nodes} k = 40.0; {thermal conductivity (W/mK)} alpha = 1e-5; {thermal diffusivity (m^2/s)} Rs = 0.025; {disk radius (m)} Zs = 0.005; {disk thickness (m)} qmax = 3.0e6; {peak flux (W/m^2)} Ro = 0.05; {parameter in flux equation (m)} Tinit = 20.0; {initial temperature (C)} Tmax = 300.0; {maximum desired temperature at top of axis (C)} var dr, dz, rhoC, dtMax, dt, time : real; i, j : Longint; C, R, L, U, D : array [1..N,1..M] of real; q, V, Aco, Aci, Af : array [1..N] of real; Told, Tnew : array [1..N+1,1..M+1] of real; begin {Size of the control volumes} dr := Rs/(N - 1); dz := Zs/(M - 1); rhoC:= k/alpha; {Control volume surface areas and volumes} Af[1] := pi*dr*dr/4.0; Af[N] := pi*dr*(Rs - dr/4.0); for i := 2 to N - 1 do Af[i] := 2.0*pi*dr*dr*(i - 1); for i := 1 to N do V[i] := Af[i]*dz; Aco[N] := 2.0*pi*Rs*dz; for i := 1 to N - 1 do Aco[i] := 2.0*pi*dr*dz*(i - 0.5); Aci[1] := 0.0; for i := 2 to N do Aci[i] := 2.0*pi*dr*dz*(i - 1.5); {Absorbed flux as function of i} q[1] := pi/4.0*qmax*dr*dr*(1.0 - 0.9/8.0*sqr(dr/Ro)); q[N] := pi*qmax*dr*dr*(N - 1.25 - 0.9/8.0*sqr(dr/Ro)*(2.0*N*N*N -7.5*N*N + 9.5*N - 65.0/16.0)); for i := 2 to N - 1 do q[i] := pi*qmax*dr*dr*(2.0*(1 - 1.0) - 0.9/4.0*sqr(dr/Ro)*(4.0*i*i*i - 12.0*i*i + 13.0*i - 5.0)); {Coefficient matrices} for i := 1 to N do for j := 1 to M do begin R[i, j] := 0.0; L[i, j] := 0.0; U[i, j] := 0.0; D[i, j] := 0.0; C[i, j] := 0.0; end; for i := 2 to N - 1 do for j := 2 to M - 1 do begin R[i, j] := Aco[i]/dr; L[i, j] := Aci[i]/dr; U[i, j] := Af[i]/dz; D[i, j] := Af[i]/dz; end; i := 1; for j := 2 to M - 1 do begin R[i, j] := Aco[i]/dr; U[i,
相关产品推荐
相关产品推荐

