一系列布尔值怪异

时间:2013-07-22 17:38:41

标签: arrays ada

我继承了这段代码,无法弄清楚它的作用。定义看起来很简单:

result : BOOLEAN ;
LOOKUP_TABLE : array
  ( BOOLEAN, BOOLEAN, BOOLEAN, BOOLEAN, BOOLEAN, BOOLEAN, BOOLEAN, BOOLEAN,
    BOOLEAN, BOOLEAN, BOOLEAN, BOOLEAN, BOOLEAN, BOOLEAN, BOOLEAN, BOOLEAN ) of
  BOOLEAN := (others => (others => (others => (others => (others => (others => (others => (others =>
             (others => (others => (others => (others => (others => (others => (others => (others => 
                TRUE ))))))))))))))));

在体内,使用如下:

result := LOOKUP_TABLE(TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE,
                       FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE );

当在GDB中转储lookup_table时,它会创建一个超过500,000个字符的行,第一个小点看起来像这样:

$1 = ((((((((((((((((true, true), (true, true)), ((true, true), (true, true))), (((true, true), (true, ...

最初我的问题是:如何将16个布尔数组减少为单个bool“结果”?但是在GDB中查看后,我不得不问“这是什么东西???”

PS:在正文中调用之后,LOOKUP_TABLE仍然是500,000个字符,其中每个布尔字段都为TRUE ...

5 个答案:

答案 0 :(得分:6)

这不是16个布尔数组。它是一个16- 数组,每个维度的范围从falsetrue,因此它有2个 16 或65536个元素。 / p>

答案 1 :(得分:6)

在Ada中,数组不是必须由从0开始的int索引。 在这种情况下,您有多维数组,其中布尔值作为索引。

初始化数组时,必须指定数组的整个范围。

一维数组看起来像这样:

Lookup_Table : array(Boolean) of Boolean := (False..True => True);

在处理较大的数组时,指定所有备选方案很不方便,因此关键字others。 这意味着尚未指定的所有替代方案,因此与上述相同:

Lookup_Table : array(Boolean) of Boolean := (others => True);

此数组现在看起来像这样(1是维度,C是内容):

   1  |  C
 -----|-----
 False|True
 True |True

在二维数组中,这将是:

Lookup_Table : array(Boolean, Boolean) of Boolean := (others => (others => True));

   1  |  2  |  C
 -----|-----|-----
 False|False|True
 False|True |True
 True |False|True
 True |True |True

在你的情况下,这是16个维度。

您可以阅读有关Ada数组here

的更多信息

答案 2 :(得分:2)

如果我这样做,并且该表的兴趣值相对较少,我可能会使用带有多部分键的Map:

with Ada.Containers.Indefinite_Ordered_Maps;

package Bool_16_Mapping is

   Key_Arity : constant := 16;

   type Key_Range is range 1 .. Key_Arity;

   type Bool_16_Keys is array (Key_Range) of Boolean;

   package Bool_16_Array_Management is
     new Ada.Containers.Indefinite_Ordered_Maps
       (Bool_16_Keys, Boolean);

end Bool_16_Mapping;

然后将感兴趣的值插入到地图中。在执行期间,使用短路 Contains()然后使用Element(),或者编写一个小函数来执行此操作。这是一个例子:

with Ada.Text_IO; use Ada.Text_IO;
with Bool_16_Mapping;

procedure Bool_16_Map_Test is

   Lookup_Table : Bool_16_Mapping.Bool_16_Array_Management.Map;

   Working_Key : Bool_16_Mapping.Bool_16_Keys := (others => False);

   function Get_Result (P1,   P2,  P3,  P4,
                        P5,   P6,  P7,  P8,
                        P9,  P10, P11, P12,
                        P13, P14, P15, P16 : Boolean) return Boolean is
      Key : Bool_16_Mapping.Bool_16_Keys := 
        (P1,  P2,  P3,  P4,  P5,  P6,  P7,  P8,
         P9, P10, P11, P12, P13, P14, P15, P16);
      Result : Boolean := False;
   begin
      if Lookup_Table.Contains(Key) then
         Result := Lookup_Table.Element(Key);
      end if;
      return Result;
   end Get_Result;

   Lookup_Result : Boolean;

   use type Bool_16_Mapping.Key_Range;

begin
   -- Initialize the table with some values
   for K in Bool_16_Mapping.Key_Range loop
      Working_Key (K) := True;
      Lookup_Table.Insert(Working_Key, K mod 2 = 0);
   end loop;

   Lookup_Result := Get_Result
     (True, True, True, False, False, False, False, False,
      False, False, False, False, False, False, False, False);
   Put_Line("#1: " & Boolean'Image(Lookup_Result));

   Lookup_Result := Get_Result
     (True, True, True, True, False, False, False, False,
      False, False, False, False, False, False, False, False);
   Put_Line("#2: " & Boolean'Image(Lookup_Result));

   Lookup_Result := Get_Result
     (False, True, True, False, False, False, False, False,
      False, False, False, False, False, False, False, False);
   Put_Line("#3: " & Boolean'Image(Lookup_Result));

end Bool_16_Map_Test;

答案 3 :(得分:1)

这种东西通常代表表示某些权限的标志。即

IsAdmin 可以编辑 CanInsert CanDelete

因此,如果有人是管理员并且可以编辑但没有插入或删除它将是:1100。也许这个大数组意味着相同。

答案 4 :(得分:0)

选择它可能是因为值稀疏。我认为你可以用一个64K bool数组替换,这是一个8K字节的数组(8192个无符号字符)。最初设置为0,并将每个使用的条目设置为1,对按键进行操作。