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