一系列布尔值怪异

eri*_*ict 5 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 ))))))))))))))));
Run Code Online (Sandbox Code Playgroud)

在体内,使用如下:

result := LOOKUP_TABLE(TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE,
                       FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE );
Run Code Online (Sandbox Code Playgroud)

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

$1 = ((((((((((((((((true, true), (true, true)), ((true, true), (true, true))), (((true, true), (true, ...
Run Code Online (Sandbox Code Playgroud)

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

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

Kei*_*son 6

那不是16布尔数组.这是一个16 维的阵列,每个尺寸为falsetrue,因此它具有2 16,或65536的元件.


egi*_*lhh 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
Run Code Online (Sandbox Code Playgroud)

在二维数组中,这将是:

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
Run Code Online (Sandbox Code Playgroud)

在你的情况下,它是16维.

您可以在此处阅读有关Ada数组的更多信息

  • 对 - 我的"减少"问题是愚蠢的,因为在16个索引的交叉处只有一个布尔值,这就是结果. (2认同)