2009-07-03 8 views
1

2次元配列で2次元座標グリッドを表現しようとしています。問題は、Delphiが配列を割り当てる方法のために、配列がX座標とY座標を反転させると宣言していることです。これにより、配列の要素を読み取ることが困難になります。印刷しようとしながら、例えば、以下のプログラムは、範囲チェックエラーを与える:Delphiで座標グリッドを表現するにはどうすればよいですか?

program Project1; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

{$R+} 
procedure play; 
var 
    grid: array of array of boolean; 
    x, y: integer; 
begin 
    try 
    setLength(grid, 3, 8); 
    grid[1, 5] := true; 
    for y := low(grid) to high(grid) do 
    begin 
     for x := low(grid[y]) to high(grid[y]) do 
     begin 
     if grid[x, y] then 
      write('X') 
     else write('.'); 
     end; 
     writeln; 
    end; 
    readln; 
    except 
    on E:Exception do 
     Writeln(E.Classname, ': ', E.Message); 
    end; 
end; 

begin 
    play; 
end. 

Iは、(グリッド[Y、X]次にする場合)起こってからそれを維持し、その後グリッドに下位索引を記述する必要が(1,5)の代わりに(5、1)にXが表示されて横向きに印刷されます。私がsetLength(grid、3、8)と言ってグリッドの形を変えようとすると。次の行に代入すると範囲チェックエラーが発生します。私はのすべてをの座標に逆に書く必要があります。そして、彼らが後方にいるのを忘れるたびに、悪いことがプログラムで起こります。

誰もが直感的に座標順序を機能させるためにあらゆるトリックを知っていますか?

答えて

4

あなただけための文で適切な境界を与える必要があります。これは、多次元配列に高い機能を適用する際に細心の注意を払うことが重要です。現在の例(2次元配列)では、低(グリッド)と高(グリッド)は最初の次元(行)の制限を返しますが、低(グリッド[0])と高最初の列(が存在するものと仮定して、)の制限を返します。私はこれをテストし、正確に何をしたいやっているようだ

program Play_console; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

{$R+} 
procedure play; 
var 
    grid: array of array of boolean; 
    x, y: integer; 
begin 
    try 
    setLength(grid, 3, 8); 
    grid[1, 5] := true; 
    for y := low(grid[0]) to high(grid[0]) do 
    begin 
     for x := low(grid) to high(grid) do 
     begin 
     if grid[x, y] then 
      write('X') 
     else write('.'); 
     end; 
     writeln; 
    end; 

    readln; 
    except 
    on E:Exception do 
     Writeln(E.Classname, ': ', E.Message); 
    end; 
end; 

begin 
    play; 
end. 

:以下の変更の制限に注意してください。

1

[yは、x]はほとんど(全て?)のプログラミング言語に共通標準配列アクセスです。それ以外の場合は、コードを見ている人にとっては混乱します。

1

私は、標準的な表現が一般的なプログラミングの慣例と一致するだけでなく、と一般的にはグラフと一致していると言います。グラフ用紙に[1,4]をプロットすると、y軸が画面座標で反転されているが、その点については不平を言っていない点を除いて、2番目(実際の結果)の例と同じことになります。

具体的には、x軸は常に水平であり、y軸は常に垂直です。それはあなたの例が示すものです。それは逆転していない。

私はちょうどそれに慣れると思います。

+1

...もちろんそうです。私はそれを書いたときに私が何を考えているのか分かりません。私は最近、グリッドを表現するのに多くの問題を抱えています。時には彼らは一方的に、時には他方に出て、壁の上で私を運転しています。 –

+0

私はこれまでの問題を実証するより良い例でそれを更新しました。 –

関連する問題