2016-07-23 5 views
1

私はこのC++コードをパスカルに変換しようとしていますが、エラー201が発生しています。は、パスカルのエラー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); 
} 

パスカルコード

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. 

おかげで、そして私のレベルのために申し訳ありませんが、英語

+2

FWIWは、C++のようにCによく似ています。 –

答えて

0

エラー201は、範囲チェックエラーと表示されます( http://www.freepascal.org/docs-html/user/userap4.html)。

uを初期化していなくても、手順btでは、un+1を比較しています。これは、任意の有効な整数である可能性があるため、奇妙な結果を引き起こす可能性があります。他の言語とは異なり、Cと同様に、Pascalは変数をデフォルト(http://www.freepascal.org/docs-html/ref/refse23.html)に初期化しません。

+0

"Pascalは変数をデフォルトに初期化しません" Delphiでは一般的ではありません。グローバルはありますが、* string *のような管理された型でなければローカルではありません。 – MartynA

+0

'void bt(int u)'を見るので、おそらくuが初期化されています。 –

+0

'u'は関数' bt'に渡されるパラメータであるため、初期化されます( 'main'では' bt(1) 'と呼ばれます).nは' scanf'で初期化されます...おそらく、OPのコードはチェックされません。 –

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. 

パスカルは、ネイティブのブール型、配列の故に私の変更の宣言を持っています。私は明示的にそれを初期化するルーチンのSetUpを含んでいます。あなたの配列bがどこから来るのか分かりません。

Btwでは、SetUpがaの要素の値をfalseに設定すると、すべての出力は一連の空白行になります。

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 := 0 to n - 1 do // for (int i=0; i<n; i++) 
をされている必要があるかのように

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

に見えるライン

Cは、範囲チェックを持っていません、そこにはそれがあなたに誤りを与えません。しかし、あなたのパスカルが持っている、そしてそのループはたぶんあなたがランタイムエラー201を取得する理由です。

私はこのプログラムが何をすべきか分かりませんが、Cプログラムが正しい結果。

nの値が99に近い場合は、スタックオーバーフローエラー(またはそれに相当するランタイム番号)が発生することもあります。ユーザがn > 99の値を入力した場合、スタックオーバーフローエラーが最初に来ない場合は、範囲チェックエラーが発生する可能性があります。

「私はn = 80と試みたが、それは年齢を取ったので、私はCtrlキーを + Cはそれを編。


また、あなたは

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

を使用することができますが、それは、Cプログラムと一致していません。 Cでは、すべての配列はゼロベースです。オリジナルのCプログラムが正しく動作するならば、私のパスカル翻訳も同様に行うべきです。

関連する問題