【问题标题】:Ada programing array of recordsAda 编程记录数组
【发布时间】:2014-10-03 01:06:12
【问题描述】:

我是 Ada 的新手,我正在尝试创建一个记录数组,然后将一些记录放入数组中,但我收到错误 nested array aggregate expected。这是我的代码:

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;

【问题讨论】:

  • 您将Image 声明为二维像素数组,然后为其分配一维像素数组。这三个像素代表什么?顶行左侧或最左侧列顶部的三个像素?

标签: ada


【解决方案1】:

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

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]。在您的情况下,每行 Image 的长度为 1。因此您聚合将有三个元素,每个元素将是另一个长度为 1 的聚合。它需要如下所示:

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

【讨论】:

  • 这一切都有效,但我不确定 OP 是否真的在尝试创建 3x1 图像...我认为意图和代码之间可能存在更大的脱节。
  • 您好,非常感谢您的回答。我试图将一行三列,无论如何我想知道你是否知道一种方法,我们可以直接从内存中读取图像并将其放入数组中,图像是一个 .bmp 文件。
  • "单元素聚合需要写成 (1=>Value)" 很好的提示!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多