我继承了这段代码,无法弄清楚它的作用。定义看起来很简单:
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 ...
答案 0 :(得分:6)
这不是16个布尔数组。它是一个16- 维数组,每个维度的范围从false
到true
,因此它有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,对按键进行操作。