包含可变长度字符串的记录数组

Jac*_*k M 1 ada

我想要一个包含整数和可变长度字符串的记录,如下所示:

type Entry is
record
    Value: Integer;
    Label: String;
end record;
Run Code Online (Sandbox Code Playgroud)

我遇到了一个问题,您不能将不受约束的字符串放入记录类型中,因此按照我尝试的该链接的建议

type Entry(Label_Length : Natural) is
record
    Value: Integer;
    Label: String(1..Label_Length);
end record;
Run Code Online (Sandbox Code Playgroud)

但现在的问题是,我想要一组这些东西:

Entries : Array(1..2) of Entry := (
    (Label_Length => 0, Value => 1, Label => ""),
    (Label_Length => 0, Value => 2, Label => "")
);

Run Code Online (Sandbox Code Playgroud)

我被告知

main.adb:17:28: unconstrained element type in array declaration
Run Code Online (Sandbox Code Playgroud)

我只是希望能够声明这些东西的(常量)数组,并以直观的方式输入标签和值(我已经不喜欢手动计算字符串长度并输入 Label_Length 了)。我怎样才能做到这一点?

Jim*_*ers 8

如果您不知道标签字段的最大大小,可以使用 Ada.Strings.Unbounded。

with Ada.Strings.Unbounded;    use Ada.Strings.Unbounded;
with Ada.Text_IO.Unbounded_IO; use Ada.Text_IO.Unbounded_IO;
with Ada.Text_IO;              use Ada.Text_IO;
with Ada.Integer_Text_IO;      use Ada.Integer_Text_IO;

procedure Main is
   type Ent is record
      Value : Integer;
      Label : Unbounded_String;
   end record;

   type ent_array is array (1 .. 4) of Ent;

   Foo : ent_array;
begin
   for I of Foo loop
      Put ("Enter a value: ");
      Get (I.Value);
      Skip_Line;
      Put ("Enter a label: ");
      I.Label := Get_Line;
      New_Line;
   end loop;

   Put_Line ("Array Foo contents:");
   for I of Foo loop
      Put (I.Value'Image & " ");
      Put_Line (I.Label);
   end loop;
end Main;
Run Code Online (Sandbox Code Playgroud)


Sim*_*ght 7

[entry是保留字。]

如果您想要一个数组,则所有条目的大小必须相同。第二条记录的大小为Label_Length(4) + Value(4) + Label( Character(1) * Label_Length),即 8 到 2**31 字节之间的任意值。

技巧是固定最大大小并给出默认值

   subtype Ent_Label_Length is Natural range 0 .. 32;

   type Ent (Label_Length : Ent_Label_Length := Ent_Label_Length'Last) is
      record
         Value : Integer;
         Label : String (1 .. Label_Length);
      end record;
Run Code Online (Sandbox Code Playgroud)

Ada.Strings.Bounded通过使用( ARM A.4.4 ) ,您可以省去编写此代码(并计算每个字符串的长度)的麻烦。