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

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,
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:45:30