Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ada 创建256个字符的数组?_Ada - Fatal编程技术网

Ada 创建256个字符的数组?

Ada 创建256个字符的数组?,ada,Ada,在这个任务中,我必须定义数据类型String_type,它必须能够存储文本。一 字符串类型应包含两个子变量:字符数组、256个字符的字段和整数 表示当前正在使用的字段的长度。请注意,String_类型与Ada中已经定义的String完全不同。我试图为这个任务编写一些代码,但似乎我还不明白这个任务真正想要什么。我的代码: with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO;

在这个任务中,我必须定义数据类型String_type,它必须能够存储文本。一 字符串类型应包含两个子变量:字符数组、256个字符的字段和整数 表示当前正在使用的字段的长度。请注意,String_类型与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;

像这样的东西似乎说明了你所描述的类型

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中非常常见的模式,当您知道必须分配一些空间,但不确定实际需要多少空间时

这个问题确实说/暗示了与字符串不同,但在实际应用程序中这似乎不太可能,所以使用子类型可能是更好的解决方案

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;
使用这样的子类型意味着与本机字符串类型的互操作性变得更加容易,因此您应该能够使用Ada.Text_IO的Get和Put子程序,而无需太多麻烦


编辑:这两个示例都不支持空数据字段,它们必须始终具有Char\u Array\u Index'的最小长度,并且需要适当考虑数据的初始化。

类似的内容似乎列出了您描述的类型

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中非常常见的模式,当您知道必须分配一些空间,但不确定实际需要多少空间时

这个问题确实说/暗示了与字符串不同,但在实际应用程序中这似乎不太可能,所以使用子类型可能是更好的解决方案

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;
使用这样的子类型意味着与本机字符串类型的互操作性变得更加容易,因此您应该能够使用Ada.Text_IO的Get和Put子程序,而无需太多麻烦


编辑:这两个示例都不支持空数据字段,它们必须始终具有Char\u Array\u Index'的最小长度,并且需要适当地考虑数据的初始化。

正如Trashgod提到的,您不能像在提供的示例中那样,将记录字段匿名定义为数组。此外,您需要命名您的字段,但您没有命名。Ada是一种强类型语言,这意味着它在很大程度上依赖于对类型的了解,有许多规则需要这样做——有一些宽松的规则,但这不是其中之一

首先,我建议只为字符串的长度创建一个数字类型。字符串可以有任何内容,从无字母到所有256个字母,以及其间的任何位置,因此我建议:

subtype String_Length is Integer range 0 .. 256;
接下来,您需要为字符串类型记录创建一个数组类型。您可以使用新声明的长度类型来帮助绑定数组,另外,如果以后要更改最大大小,只需更改字符串长度类型定义,字符串类型就会自动调整最大长度

type Character_Array is array (1..String_Length'Last) of Character;
现在,您可以使用这些设置在字符串类型中创建字段:

type String_Type is record
    Char_Array  : Character_Array;
    Length      : String_Length := 0;
end record;
这为您提供了一个很好的字符串类型,用于检查错误的长度值


另一方面,我注意到您正在尝试使用Get过程来获取记录中的长度和字符数组。我建议实例化一个通用包Ada.Text\u IO.Integer\u IOString\u Length的实例,并使用该包中的Get过程读取字符串长度。读取字符串有点棘手,因为您使用的是自己的自定义类型,Get函数需要一个Ada字符串,但这不是您最初问题的一部分,所以希望您能够解决这个问题并找出一个算法。我建议使用Ada string类型的伪变量,大小与您期望的字符串长度匹配,然后使用循环将其复制到您的Char_数组变量。

正如Trashgod所提到的,您不能像在提供的示例中那样将记录字段匿名定义为数组。此外,您需要命名您的字段,但您没有命名。Ada是一种强类型语言,这意味着它在很大程度上依赖于对类型的了解,有许多规则需要这样做——有一些宽松的规则,但这不是其中之一

首先,我建议只为字符串的长度创建一个数字类型。字符串可以有任何内容,从无字母到所有256个字母,以及其间的任何位置,因此我建议:

subtype String_Length is Integer range 0 .. 256;
接下来,您需要为字符串类型记录创建一个数组类型。您可以使用新声明的长度类型来帮助绑定数组,另外,如果以后要更改最大大小,只需更改字符串长度类型定义,字符串类型就会自动调整最大长度

type Character_Array is array (1..String_Length'Last) of Character;
现在,您可以使用这些设置在字符串类型中创建字段:

type String_Type is record
    Char_Array  : Character_Array;
    Length      : String_Length := 0;
end record;
这为您提供了一个很好的字符串类型 检查错误的长度值


另一方面,我注意到您正在尝试使用Get过程来获取记录中的长度和字符数组。我建议实例化一个通用包Ada.Text\u IO.Integer\u IOString\u Length的实例,并使用该包中的Get过程读取字符串长度。读取字符串有点棘手,因为您使用的是自己的自定义类型,Get函数需要一个Ada字符串,但这不是您最初问题的一部分,所以希望您能够解决这个问题并找出一个算法。我建议使用Ada string类型的伪变量,其大小与预期的字符串长度相匹配,然后使用循环将其复制到Char_数组变量。

我看到了记录长度组件的定义标识符,但没有看到数组的定义标识符;更多信息。由于不允许匿名数组作为组件,您还需要数组的类型声明,例如Char_array_type。这听起来与语言参考手册a.4.4节中描述的包Ada.Strings.Bounded非常相似。无界字符串名称:无界_string;在这里不起作用。长度固定为256个字符。只需实例化大小为256的有界字符串。它具有您想要的所有功能;更多信息。由于不允许匿名数组作为组件,您还需要数组的类型声明,例如Char_array_type。这听起来与语言参考手册a.4.4节中描述的包Ada.Strings.Bounded非常相似。无界字符串名称:无界_string;在这里不起作用。长度固定为256个字符。只需实例化大小为256的有界字符串。它具有您想要的所有功能。您如何在主函数中调用长度和数据?我尝试使用:A:String\u Type;在结束记录之后,然后通过编写GetA.Length在Main中调用它,但我遇到了一个编译器错误。为什么同时具有大小和长度?@XerxesGoogle这是因为a的类型。Length与Get过程所期望的类型不同,可能期望的是字符串或整数,具体取决于您在中使用的内容。如果要对.Length使用Get调用,则需要实例化通用包Ada.Text\u IO.Integer\u IOChar\u Array\u Index,然后使用该包中的Get操作,以及如何在main函数中调用Length和数据?我尝试使用:A:String\u Type;在结束记录之后,然后通过编写GetA.Length在Main中调用它,但我遇到了一个编译器错误。为什么同时具有大小和长度?@XerxesGoogle这是因为a的类型。Length与Get过程所期望的类型不同,可能期望的是字符串或整数,具体取决于您在中使用的内容。如果要对.Length使用Get调用,需要实例化通用包Ada.Text\u IO.Integer\u IOChar\u Array\u Index,然后使用该包的Get操作