FreePascal 退出代码 201

问题描述 投票:0回答:1

我能够编译该程序,但无法运行它。我需要插入 N=11、dtmax=0.0003 并使用 M=11、21、41 和 61 进行试验。我尝试使用常量输入值,并在

writeln
中说明它们,但它不起作用。

在我的

writeln
语句中,我尝试输入值 11。我不知道出了什么问题。

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.

我查找了如何调试退出代码 201 并将

integer
更改为
Longint
但没有解决问题。我尝试在
writeln
语句中插入值,但它不起作用。我可以看到弹出的屏幕,但我无法阅读它,因为它消失了。

input freepascal exit-code
1个回答
0
投票

帕斯卡退出代码 201

编程语言Pascal 不定义任何退出代码,而是定义您的实现(在本例中为 FreePascal)。 不同 Pascal 实现可能会报告不同退出代码(如果有的话)。

[…]我查找了如何调试退出代码 201 并将整数更改为 Longin,但它[没有]解决它。 […]

FreePascal 编译器将 RTE 201 定义为范围检查错误。 您必须启用它们,一般来说,您应该始终启用它们,或者至少在开发阶段启用它们,如果速度很重要的话。 正如

Stuart 已经指出的那样

,第 157 行中的 tNew 赋值表达式以及后续访问,或者“尝试”访问(如果打开了范围检查)、不存在的数组元素。 这是由您的

+ 1
− 1
计算引起的。
本着您的编码风格的精神,“快速而肮脏”的修复方法是替换

i + 1

    i + ord(i < N)
  • ,
    i ‑ 1
  • i ‑ ord(i > 1)
  • ,
    j + 1
  • j + ord(j < M)
  • j ‑ 1
  • j ‑ ord(j > 1)
  • 
    
    另一个浪费的伪解决方案是通过必要的附加行和列来扩展表格。
  • Told, Tnew : array [0..N+1,0..M+1] of real;

请注意,两个维度的新最小值均为零。 如果您已将附加行和列初始化为不影响计算的值(例如适当的加法或乘法的

neutral
元素),则此方法效果很好。

旁注:


您似乎没有使用阴极射线管或打印机。 整个

uses

子句可以删除。 它减少了可执行二进制文件的大小。
  • 你写了很多
    11
  • writeLn
  • 的论点)。 这似乎是一个“神奇”常量,因此最好为此声明并使用
    const
    ant。
    主循环的终止条件是
    time < −1.0
    。 除非你发明了时间机器,否则我建议你严格按照时间前进,即。 e.确保
  • dt
  • (对于
    time ≔ time + dt
    )不能是正数。
    单字符标识符太多。
    如果您无法想出更好的名称来一目了然地揭示其含义,请至少使用非常通用的 
    row
  • columnMaximum
  • 标识符。
    您不使用任何例程。
    你把所有东西都塞进了你的
    program
    的主要部分。 将任务拆分为例程似乎会带来复杂性,但有利于提高可读性。 请记住,您的编程
  • 是为人类
  • ;计算机也可能想要处理您的代码这一事实(几乎)与您无关。 或者至少使用大屁股注释
    在视觉上
    划分你的代码,这是我在编程时在汇编中所做的事情。
© www.soinside.com 2019 - 2024. All rights reserved.