Pergunta

Eu estou tentando representar uma grade de coordenadas bidimensional com uma matriz bidimensional. O problema é, declarando a matriz vira as coordenadas X e Y, devido à forma Delphi aloca a matriz. Isso torna difícil para ler elementos do array. Por exemplo, o seguinte programa dá um erro de verificação de intervalo ao tentar imprimir:

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.

Eu tenho que escrever as costas de índice (se grade [y, x], em seguida,) para evitar que isso aconteça, mas, em seguida, a grade imprime lado, com o X mostrado em (5, 1) em vez de em (1, 5). Se eu tentar mudar a forma da grade dizendo SetLength (grid, 3, 8); em seguida, a atribuição na linha seguinte dá um erro de verificação de intervalo. Eu acabar por ter de escrever todas de minhas coordenadas para trás, ea qualquer momento eu esqueço que eles estão para trás, coisas ruins acabar acontecendo no programa.

Alguém sabe todos os truques para fazer o trabalho coordenar ordem intuitivamente?

Foi útil?

Solução

Você só precisa dar os limites adequados na declarações. É importante prestar atenção ao aplicar o baixo e alta funções para arrays multi-dimensionais. Para o exemplo actual (uma matriz de duas dimensões), baixa (grade) e alta (grade) irá retornar os limites sobre a primeira dimensão (linha), enquanto a baixa (grade [0]) e alta (grade [0]) vai devolver os limites na primeira coluna ( assumindo que existe ). Observe o mudou limites abaixo:

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.

Eu testei isso e parece fazer exatamente o que você quer.

Outras dicas

[y, x] é o acesso comum e padrão variedade na maioria (todos?) Linguagens de programação. Vai ser confuso para alguém olhar para o seu código se você fazê-lo de outra forma.

Eu diria que a representação padrão não só é consistente com a convenção de programação geral, é consistente com gráficos em geral . Plot [1,4] no papel de gráfico e você vai ter a mesma coisa que em sua segunda (resultado real) exemplo, com a ressalva de que o eixo y é invertida em coordenadas de tela, mas você não está reclamando sobre isso.

Mais especificamente, o eixo x é sempre horizontal, e o eixo y é sempre vertical. Isso é o que seu exemplo shows. Não é revertida.

Eu diria que apenas se acostumar com isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top