阿达:包装具有可变大小的数组记录(Ada: packing record with variable

2019-10-19 17:12发布

我期待创造一个包装记录,可容纳一个数组长度的变化从5 - 50元素。 是否有可能做这样的方式记录可以无浪费空间来装? 我就知道有多少元素会在数组中,当我去创造纪录。

-- the range of the array
type Array_Range_T is Integer range 5 .. 50;

-- the array type
type Array_Type_T is array range (Array_Range_T) of Integer;

-- the record
type My_Record_T (Array_Length : Integer := 5) is
  record
    -- OTHER DATA HERE
    The_Array : Array_Type_T(Array_Length);
  end record;
-- Pack the record
for My_Record_T use
  record
    -- OTHER DATA
    The_Array at 10 range 0 .. Array_Length * 16;
  end record;

for My_Record_T'Size use 80 + (Array_Length * 16);

这显然将不能编译,但显示的是什么,我试图做的精神。 如果可能的话,我想保持数组的长度进行记录的。

谢谢!

Answer 1:

是不是真的有在艾达的方式来表示记录你问了道路。 然而,由于你的关心真的是不与记录是如何在内存中表示的,而是以它是如何传输到插座,你也许并不需要担心记录表示子句。

相反,你可以定义你自己Write程序:

procedure Write (Stream : not null access Ada.Streams.Root_Stream_Type'Class;
                 Item   : in My_Record_T);
for My_Record_T'Write use Write;

或者,我相信,这将在2012年阿达工作:

type My_Record_T is record
    ...
end record
with Write => Write;

procedure Write (Stream : not null access Ada.Streams.Root_Stream_Type'Class;
                 Item   : in My_Record_T);

然后身体看起来像

procedure Write (Stream : not null access Ada.Streams.Root_Stream_Type'Class;
                 Item   : in My_Record_T) is
begin
    -- Write out the record components, EXCEPT Array_Length and The_Array.
    T1'Write (Stream, Item.F1);  -- F1 is a record field, T1 is its type
    T2'Write (Stream, Item.F2);  -- F2 is a record field, T2 is its type
    ...

    -- Now write the desired data 
    declare
        Data_To_Write : Array_Type_T (1 .. Item.Array_Length)
            renames Item.The_Array (1 .. Item.Array_Length);
                -- I'm assuming the lower bound is 1, but if not, adjust your code
                -- accordingly
    begin
        Array_Type_T'Write (Stream, Data_To_Write);
            -- Note: using 'Write will write just the data, without any bound 
            -- information, which is what you want.
    end;
end Write;

如果其它组件需要打包,但是,例如,如果你想要一个字节写入包含一个3位记录组件和一个5位记录组件插座这是行不通的。 如果这是必要的,我不认为内置的'Write属性会为你做的; 你可能需要做自己的位变换,或者你可以得到棘手和定义的数组Stream_Elements并使用Address条款或方面来定义覆盖的记录的其余部分的数组。 但是,除非我是100%肯定,在插座的另一端的读者都使用完全相同的类型定义的阿达程序我不会用叠加的方法。

注:我没有测试过这一点。



Answer 2:

不知道我完全理解你想实现什么,但你不能做这样的事情

-- the range of the array
type Array_Range_T is range 1 .. 50;

-- the array type
type Array_Type_T is array (Array_Range_T range <>) of Integer;

Array_Length : constant := 5; --5 elements in the array

-- the record
type My_Record_T is
 record
    -- OTHER DATA HERE
    The_Array : Array_Type_T (1 .. Array_Length);
  end record;

-- Pack the record
for My_Record_T use
 record
-- OTHER DATA
The_Array at 0 range 0 .. (Array_Length * Integer'Size) - 1 ;
end record;

for My_Record_T'Size use (Array_Length * Integer'Size);


文章来源: Ada: packing record with variable sized array
标签: arrays ada