创建具有256个字符的数组?

问题描述

在此任务中,我必须定义数据类型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的初始化。