需要帮助修复Pascal中的错误201

need help to fix Error 201 in Pascal

本文关键字:错误 Pascal 帮助      更新时间:2023-10-16

我正试图将此C++代码转换为Pascal,但遇到错误201。有人能帮我修吗?

C++代码

int n; 
bool a[100];
void show()
{
    for (int i=1; i<=n; i++)
        if (a[i]) 
            printf("%d ", i);
    printf("n"); 
}
void bt(int u)
{
    if (u==n+1) 
    {
        show();
        return ;
    }
    a[u]=0;
    bt(u+1);
    a[u]=1;
    bt(u+1); 
}
main()
{
    scanf("%d", &n);
    bt(1); 
}

Pascal代码

type data = integer; var i,n:integer; a:array[0..100] of integer; b:array[0..100] of integer;
procedure show; var i:data; begin
    for i:=1 to n do
    begin
    if (b[i]=0) then
    writeln(a[i]);
    end; end;
procedure bt(i:data); var u:data; begin
    if (u=n+1) then
     begin
         show();
     end
    else
      b[u]:=0;
      bt(u+1);
      b[u]:=1;
      bt(u+1);
end;
begin
    write('Nhap n ');
    readln(n);
    bt(1); end.

谢谢,很抱歉我的英语水平

我的c++有点生疏,但对我来说这不是一个准确的翻译

type
  data = integer;
var
  // i, 
  n : integer;
  a : array[0..100] of boolean; // integer;
//  b : array[0..100] of integer;
procedure SetUp;
var
  i : Integer;
begin
  for i := 0 to 100 do
    a[i] := True;
end;
procedure show;
var
  i : data;
begin
  for i := 1 to n do
  begin
    if a[i] then
      write(i);
  end;
  writeln;
end;
procedure bt(i : data);
var
  u : data;
begin
  if ( u = n + 1) then
   begin
     show();
   end;
///  else
//    b[u] := False;
  bt(u + 1);
  a[u] := True;
  bt(u+1);
end;
begin
  SetUp;
  write('Nhap n ');
  readln(n);
  bt(1);
  readln;
end.

Pascal有一个原生的Boolean类型,因此我更改了数组a的声明。我包含了一个例程SetUp来显式初始化它。我不确定你的数组b来自哪里。

顺便说一句,如果SetUp将a元素的值设置为false,那么您将得到的所有输出都是一系列空行。

一个尽可能精确的转换是:

program StackOverflow1;
{$APPTYPE CONSOLE}
var
  n: Integer;
  a: array[0..99] of Boolean;
procedure show;
var
  i: Integer;
begin
  for i := 1 to n do       // This is very suspicious! 
    if a[i] then
      Write(i, ' ');
  Writeln;
end;
procedure bt(u: Integer);
begin
  if u = n + 1 then
  begin
    Show;
    Exit;
  end;
  a[u] := False;
  bt(u + 1);
  a[u] := True;
  bt(u + 1);
end;
begin
  Writeln('enter n:');
  Readln(n);
  bt(1);
end.

线路

for i := 1 to n do     // for (int i=1; i<=n; i++)

看起来应该是

for i := 0 to n - 1 do // for (int i=0; i<n; i++)

C没有范围检查,所以它不会给你一个错误。但是您的Pascal有,这个循环可能就是您得到运行时错误201的原因。

我不知道这个程序应该做什么,但如果C程序没有提供正确的结果,我也不会感到惊讶。

如果n的值接近99,您会得到堆栈溢出错误(或其等效的运行时数),我也不会感到惊讶。如果用户输入n > 99的值,这可能会导致范围检查错误,有时,如果堆栈溢出错误不是第一个出现的话。

我尝试了n = 80,它花了很长时间,所以我Ctrl+C就搞定了。


或者,您可以使用

  a: array[1..100] of Boolean;

但是这与C程序不匹配。在C中,所有数组都是以零为基础的。如果原始的C程序工作正常,那么我的Pascal翻译也应该正常。

错误201似乎是范围检查错误(http://www.freepascal.org/docs-html/user/userap4.html)。

在过程bt中,即使尚未初始化u,也要将un+1进行比较。这可能会导致奇怪的结果,因为它可能是任何有效的整数。与某些其他语言不同,但与C语言类似,Pascal不会将变量初始化为默认值(http://www.freepascal.org/docs-html/ref/refse23.html)。