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

时间:2016-07-23 02:51:27

标签: c++ pascal

我试图将此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.

谢谢,对不起我的英语水平

3 个答案:

答案 0 :(得分:1)

我的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有一个原生的布尔类型,因此我更改了数组a的声明。我已经包含了一个例程SetUp来显式初始化它。我不确定你的阵列b来自哪里。

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

答案 1 :(得分:1)

尽可能准确的转换是:

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程序没有提供正确的结果,我也不会感到惊讶。

如果对于接近99的n值,您将得到堆栈溢出错误(或其等效的运行时编号),这也不会让我感到惊讶。如果用户输入n > 99的值,如果堆栈溢出错误没有出现,这可能会导致范围检查错误。

我尝试使用n = 80,这需要很长时间,所以我 Ctrl + C &#39b。

或者,您可以使用

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

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

答案 2 :(得分:0)

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

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