我想要一个包含整数和可变长度字符串的记录,如下所示:
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 了)。我怎样才能做到这一点?
如果您不知道标签字段的最大大小,可以使用 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)
[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 ) ,您可以省去编写此代码(并计算每个字符串的长度)的麻烦。