以编程方式创建的数组类型变量名?

时间:2017-12-03 03:10:53

标签: arrays variables ada named

在Ada中,我希望创建10个类型为array(0..9)Integer的二维数组,创建10 x 10个单元格数组,我将通过索引进行操作。我希望能够分别处理10个层中的每个层,理想情况是通过混合变量名称,如“layer_(i)”(row,col):= xxx,而不是必须通过其静态名称(如“layer_1”)访问每个layer_x或者“layer_2”,所以我可以对每一层运行相同的程序算法,只需改变我的索引以适应每一层。

我有:

type grid is array (0..9) of Integer, (0..9) of integer;
layer_1, layer_2, layer_3, layer_4, layer_5,
  layer_6, layer_7, layer_8, layer_9, layer_0: grid;

有没有我可以动态创建一个grid类型的变量,以便我可以通过“layer _”(x)而不是完整的静态名称“layer_1”来解决它?

====== 在发布这个之后,我意识到了一个可能的解决方案,虽然它没有直接解决问题中的细节,而是另一种解决方案。

我可以创建一个三维数组,或者二维数组的数组,我可以将其作为块(l,r,c)表示为层,r表示行,c表示列,而不是具有完整变量像Layer_1,layer_2等名称。在任何一种情况下,我将有1,000个单元格。当考虑数组中的结构时,也许没有办法解决这个问题,尽管数组似乎是第一个测试选择而不是单元格列表,这将涉及对人类概念化难以进行的先前和后续单元格的一些参考,但很好对于机器。

===== 而且,进一步思考我看到我不想要一个三维数组,但是一个包含10个10 x 10阵列的10个实例的单维数组将会起作用。我可以使用3个嵌套循环进行寻址,并且在操作每个10 x 10阵列中的100个单元时使用相同的代码,具体取决于10x10阵列的主要数组,并且可以使用循环变量立即访问每10个10网格中的每个单元L,R,C

2 个答案:

答案 0 :(得分:2)

你的问题并不是那么清楚,但首先你要讨论的是二维细胞阵列:

type Coordinates is [some discrete subtype];
type Cell is [some type];

type Grid is array (Coordinates, Coordinates) of Cell;

这些层次:

type Layer_Indices is [some discrete subtype];

type Layers is array (Layer_Indices range <>) of Grid;

答案 1 :(得分:0)

您还可以将矢量用于图层索引。向量是可索引的并且是动态的。

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Containers.Vectors; use Ada.Containers;

procedure Hello is

    type Grid is array (1..10,1..10) of Integer;

    package Grid_Vectors is new Vectors(Positive,Grid);

    subtype Vector is Grid_Vectors.Vector;

    Layers : Vector;

    procedure Print(The_Grid : Grid) is
    begin
        for x in The_Grid'Range(1) loop
            for y in The_Grid'Range(2) loop
                Put(Integer'Image(The_Grid(x,y)) & " "); -- print each one'
            end loop;
            New_Line;
        end loop;   
    end Print;

begin

  Put_Line("Hello, world!");

  -- add a lot of layers
  for Index in 1..20 loop
      declare
        New_Grid : Grid := (others => (others => Index));
      begin
        Layers.Append(New_Grid);
      end;
  end loop;

  -- make some sort of adjustment to a specific layer
  Layers(3)(1,3) := 23;

  -- Print the grid
  Print(Layers(3));

end Hello;