2014-10-02 66 views
0

我是新来的Ada,我试图创建一个记录数组,然后把一些记录放到数组中,但是我得到错误nested array aggregate expected。这是我的代码:Ada编程数组记录

with Ada.Text_IO; use Ada.Text_IO; 
with Ada.Integer_Text_Io; 
with Ada.unchecked_conversion; 

procedure main is 
    type Byte is range 0..255; 
    for Byte'Size use 8; 

    type Pixel is record 
    R:Byte; 
    G:Byte; 
    B:Byte; 
    end record; 
    for Pixel'Size use 24; 

    r1:Pixel := (1,2,5); 
    r2:Pixel := (1,2,3); 
    r3:Pixel := (1,2,3); 

    type Image is array(Positive range <>, Positive range <>) of Pixel; 
    Pragma Pack(Image); 

    Left:Image(1..3, 1..1) := (r1, r2, r3); 
begin 
    null; 
end main; 
+0

你声明'图像“作为像素的二维阵列,但是然后为其分配一维像素阵列。这三个像素代表什么?顶部行左边的三个像素还是最左边一列的顶部? – 2014-10-02 14:58:57

回答

5

一个二维数组需要一个二维聚合,即每个元素也是一个聚合的聚合。例如:

type Integer_Matrix is array (Positive range <>, Positive range <>) of Integer; 
M : Integer_Matrix (1..2, 1..2) := ((1, 2), (3, 4)); 

当任一维的长度为1时,它需要特殊处理,因为括号中的单个值不被视为聚合。单元素集合需要写成(1 => Value)[如果需要,使用实际的索引代替1]。在你的情况下,图像的每一行有长度1.所以,你会聚集有三个元素,每个元素将是长度为1的另一个聚集这将需要看起来像这样:

Left : Image (1..3, 1..1) := ((1=>r1), (1=>r2), (1=>r3)); 
+0

这一切都是有效的,但我不确定OP实际上是在尝试创建3x1图像......我认为在意图和代码之间可能存在更大的断开连接。 – 2014-10-02 14:59:47

+0

你好,非常感谢你的回答。我试图把一行三列,无论如何,我想知道如果你知道一种方法,我们可以直接从内存中读取图像,并将其放入数组中,图像是一个.bmp文件。 – omar 2014-10-03 08:30:27