Arrays Ada中的字符串数组

Arrays Ada中的字符串数组,arrays,string,ada,dynamic-allocation,Arrays,String,Ada,Dynamic Allocation,我在Ada95中有一个程序,我必须在其中创建一个字符串数组。此数组可以包含长度可变的字符串 例如: 我已经声明了一个数组,其中所有索引都可以存储大小为50的字符串。当我给上面的数组分配一个较小的字符串时,我得到“Constraint Error” 代码: 我已尝试创建无界_字符串数组。但这也不行。有人能告诉我如何在上面的字符串数组中存储这个“12345”吗?您可以使用,如图所示,或者您可以使用静态不规则数组,如图所示。后一种方法使用一组别名组件,每个组件可能具有不同的长度 type String

我在Ada95中有一个程序,我必须在其中创建一个字符串数组。此数组可以包含长度可变的字符串

例如: 我已经声明了一个数组,其中所有索引都可以存储大小为50的字符串。当我给上面的数组分配一个较小的字符串时,我得到“Constraint Error”

代码:

我已尝试创建无界_字符串数组。但这也不行。有人能告诉我如何在上面的字符串数组中存储这个“12345”吗?

您可以使用,如图所示,或者您可以使用静态不规则数组,如图所示。后一种方法使用一组别名组件,每个组件可能具有不同的长度

type String_Access is access constant String;

String_5: aliased constant String := "12345";
String_6: aliased constant String := "123456";
String_7: aliased constant String := "1234567";
...

Input_Array: array (1..N) of
   String_Access :=
      (1 => String_5'Access,
       2 => String_6'Access,
       3 => String_7'Access,
       -- etc. up to N
      );

如果使用
无界_String
,则不能直接为其分配字符串文字。字符串文字可以有类型
String
Wide\u String
,或
Wide\u Wide\u String
,但没有其他内容;Ada中的赋值通常要求目标和源是相同的类型。要将
字符串
转换为
无界字符串
,需要调用
To_无界字符串
函数:

procedure anyname is
    input_array : array(1..5) of Ada.Strings.Unbounded.Unbounded_String;
begin
    input_array(1) := Ada.Strings.Unbounded.To_Unbounded_String ("12345");
end anyname;
您可以使用
use
子句来缩短名称;其他一些程序员可能会定义自己的重命名函数,甚至可能使用一元
“+”
运算符:

function "+" (Source : String) return Ada.Strings.Unbounded.Unbounded_String
    renames Ada.Strings.Unbounded.To_Unbounded_String;

procedure anyname is
    input_array : array(1..5) of Ada.Strings.Unbounded.Unbounded_String;
begin
    input_array(1) := +"12345";  -- uses renaming "+" operator
end anyname;

并非所有人都喜欢这种风格。

Ada中的字符串是固定长度的字符数组。为了使用可变长度的字符串(当需要字符串数组时,通常会出现这种情况,例如名称数组,每个名称都是可变长度的),可以将每个单独的字符串声明为无界_字符串。唯一需要注意的是,这是从堆内存分配的。下面是Ada中字符串数组的完整示例

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

procedure arrayAda is
type DaysArray is array(1..7) of Unbounded_String;
days: DaysArray;
begin
    days(1):=To_Unbounded_String("Sunday");
    days(2):=To_Unbounded_String("Monday");
    days(3):=To_Unbounded_String("Tuesday");
    days(4):=To_Unbounded_String("Wednesday");
    days(5):=To_Unbounded_String("Thursday");
    days(6):=To_Unbounded_String("Friday");
    days(7):=To_Unbounded_String("Saturday");
    for index in 1..7 loop
        Put(days(index));
        Put("   ");
    end loop;
end arrayAda;
这将产生以下输出:

$ ./arrayAda
Sunday   Monday   Tuesday   Wednesday   Thursday   Friday   Saturday

解决方法是使用
无界\u字符串
。请显示您试图在其中创建无边界字符串数组的代码。
String
类型不允许长度可变的字符串。对于无界_字符串,我使用了以下代码:input_数组:=无界_字符串的数组(1..5);然后我得到了以下错误:“预期的私有类型”Ada.Strings.Unbounded.Unbounded_String”。然后我尝试将代码更改为:input_array:Ada.Strings.Unbounded.Unbounded_String的数组(1..5);现在我无法将值分配给input_数组(1)如果您试图使用字符串文字直接使用
:=
,请查看我的答案。一般来说,请更具体地说明您遇到了什么问题。比如说“我做不到”或“它不起作用”“我们在StackOverflow方面做得不够好,因为我们不是读心术的人。相反,把你试过的代码和收到的错误信息贴出来。谢谢ajb。你的代码可以工作。我为无界字符串编写了以下代码。代码:过程anyname是Ada.Strings.Unbounded.Unbounded\u字符串的输入数组:数组(1..5);开始输入_数组(1):=Ada.Strings.Unbounded.To_Unbounded_String(“12345”);put_行(输入_数组(1)的长度);将_行(输入_数组(1)’放在第一位;将_行(输入_数组(1)”放在最后一行;结束任何名字;但我得到了这些错误:“length”属性的前缀可能不是私有类型“first”属性的前缀可能不是私有类型“last”属性的前缀可能不是私有类型
“length
不适用于
无界\u字符串
。要使用
无界_字符串
,必须使用RM中定义的过程和函数。您不能使用用于
字符串
或其他
数组
类型的内容,因为
无界字符串
不是数组。请阅读RM文档“Ada中的分配通常要求目标和源为同一类型”您能否澄清“通常”?使用
+
运算符重命名转换函数是否为Ada惯用法?我以前没见过。
$ ./arrayAda
Sunday   Monday   Tuesday   Wednesday   Thursday   Friday   Saturday