问题描述
在此任务中,我必须定义数据类型String_Type
,该数据类型必须能够存储文本。一
String_Type
应包含两个子变量Char_Array
,一个256个字符的字段和一个整数
Length
告诉您当前正在使用多少字段。请注意,String_Type
与Ada中已经定义的String
完全不同。我已经尝试为该任务编写一些代码,但似乎我还不了解该任务真正想要的是什么。我的代码:
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
procedure data is
type String_type is
record
array (Positive range <>) of Character; --Error: Component declaration expected
Heltal_length: Integer;
end record;
P1: String_type;
begin
Put("Write your characters: ");
Get(P1.Char_array);
Put(P1.Char_array);
end data;
解决方法
正如Trashgod所述,您不能像在提供的示例中那样,仅将记录字段匿名定义为数组。此外,您需要命名字段,但没有。 Ada是一种“强类型”语言,意味着它在很大程度上取决于对类型的了解,并且有许多规则要求使用此类型(有一些宽松的规则,但这不是其中之一)。
首先,我建议您为字符串的长度创建一个数字类型。您的字符串可以有从无字母到256个字母之间的任何字符,因此我建议:
subtype String_Length is Integer range 0 .. 256;
接下来,您需要为String_Type记录创建一个数组类型。您可以使用新声明的长度类型来帮助您绑定数组,并获得额外的好处,如果您以后想要更改最大大小,则只需更改String_Length类型定义,然后String_Type将自动调整最大长度。>
type Character_Array is array (1..String_Length'Last) of Character;
现在,您可以使用它们在String_Type中创建一个字段:
type String_Type is record
Char_Array : Character_Array;
Length : String_Length := 0;
end record;
这为您提供了一种不错的字符串类型,可以检查错误的长度值。
请注意,我注意到您正在尝试使用Get过程来获取记录中的长度和字符数组。我建议实例化通用包Ada.Text_IO.Integer_IO(String_Length)的实例,并使用该包中的Get过程读取字符串长度。读取String有点棘手,因为您正在使用自己的自定义类型,并且Get函数需要一个Ada String,但这不是您最初的问题的一部分,因此希望您可以通过尝试并找出算法来解决。我建议您使用Ada字符串类型的虚拟变量(大小与您期望的字符串长度匹配),然后使用循环将其复制到Char_Array变量中。
,类似的东西似乎可以说明您描述的类型
procedure Main is
type Char_Array_Index is range 1 .. 256;
type Char_Array is array (Char_Array_Index) of Character;
type String_Type
(Size : Char_Array_Index := Char_Array_Index'First) is
record
Length : Char_Array_Index;
Data : Char_Array;
end record;
begin
-- Insert code here.
null;
end Main;
请注意区分参数的记录。尽管不一定需要字符串,但这在Spark / Ada中是很常见的模式,当您知道必须分配 some 空间,但是不确定多少时,我会真正需要的。
这个问题确实说/暗示与String不同,但这在现实应用中似乎不太可能,因此也许使用子类型是更好的解决方案
procedure Main is
subtype Char_Array_Index is Positive range 1 .. 256;
subtype Char_Array is String (Char_Array_Index);
type String_Type
(Size : Char_Array_Index := Char_Array_Index'First) is
record
Length : Char_Array_Index;
Data : Char_Array;
end record;
begin
-- Insert code here.
null;
end Main;
使用这样的子类型意味着与本机String类型的互操作性变得更加容易,因此您应该能够使用Ada.Text_IO的Get和Put子程序而不必费心。
编辑:这两个示例都不支持空的Data字段,它们必须始终具有Char_Array_Index'First的最小长度,并且需要适当考虑Data的初始化。