Arrays 无法打印字符串常量数组字符串的内容?

Arrays 无法打印字符串常量数组字符串的内容?,arrays,ada,Arrays,Ada,对于Ada,我是一个初学者,我正在尝试声明和使用不同长度的字符串数组 使用Ada'83,我可以声明一个可变长度字符串常量数组,如下所示(示例取自) 尽管结果看起来是一个字符数组,但它们的行为却不像字符串,这让我非常沮丧。当我试图编译以下代码时,我收到一条错误消息“在重载解析期间检测到不一致[LRM 8.7]” for COUNT in TESTS'Range loop Put(TESTS(COUNT)); New_Line; end loop; 但是,我可以使用以下代码打印出每个“

对于Ada,我是一个初学者,我正在尝试声明和使用不同长度的字符串数组

使用Ada'83,我可以声明一个可变长度字符串常量数组,如下所示(示例取自)

尽管结果看起来是一个字符数组,但它们的行为却不像字符串,这让我非常沮丧。当我试图编译以下代码时,我收到一条错误消息“在重载解析期间检测到不一致[LRM 8.7]”

for COUNT in TESTS'Range loop
   Put(TESTS(COUNT));
   New_Line;
end loop;
但是,我可以使用以下代码打印出每个“字符串”的内容

for COUNT in TEST'Range loop
   for COUNTER in TEST(COUNT)'Range loop
      Put(TEST(COUNT)(COUNTER));
   end loop;
   New_Line;
end loop;
不幸的是,我想使用这些值来测试一些以字符串作为参数的代码,所以这并没有真正的帮助

在Ada'83中,有没有一种方法可以迭代长度可变的字符串常量数组,或者将字符数组转换为长度可变的字符串

谢谢


不,这不是家庭作业,是的,我知道我在使用一个古老的编译器

测试
未定义;我猜你的意思是测试

不是字符串类型;它是一种访问类型。要引用访问值指定的值,可以使用
。all

Tests (Tests'First).all
这是一根绳子。Ada包含一些访问数组类型的快捷方式,使它们更易于使用,允许在属性和索引之前删除所有的,这就是为什么
测试(计数)范围
测试(计数)(计数器)
有效的原因。但是,要引用整个值,
.all
是必需的:

Text_IO.Put_Line (Item => Tests (Counter).all);
然而,更好的方法是定义一个可变长度的字符串抽象,并使用它来代替访问类型


谢谢你,这是一种享受——不过,我该如何定义呢 “可变长度字符串抽象”来完成相同的工作

使用
private
-types+
access
-types,可能如下所示:

Package String_Abstraction is
    
    Type DString is private;
    Function "+"( Right : DString ) return  String;
    Function "+"( Right :  String ) return DString;
    Function "&"( Left, Right : String ) return DString;
    --...
Private
    Type Data(<>);
    Type DString is access Data;
End String_Abstraction;
可按如下方式使用:

Table : Constant Array(Positive range <>) of String_Abstraction.DString:=
  ( String_Abstraction."+"( "This" ),
    String_Abstraction."+"( "EXAMPLE" ),
    String_Abstraction."+"( "list" ),
    String_Abstraction."+"( "exists." )
  );
如果在表的声明之前有一个
use
,您可以:

Use String_Abstraction;
Table : Constant Array(Positive range <>) of String_Abstraction.DString:=
  ( +"This",
    +"EXAMPLE",
    +"list",
    +"exists."
  );
使用字符串\u抽象;
表:String_Abstraction.DString的常量数组(正范围):=
(+“这个”,
+“示例”,
+“名单”,
+“存在。”
);

它当然不完整,但这给了你如何做的基本想法。

GNAT Studio社区版可供自由职业者和爱好爱好者免费使用。它预装了一个像样的Ada 2012编译器。我还必须安装一个名为adagde的小插件来运行代码


如果你想找一本最新的书学习,我强烈推荐约翰·巴恩斯的《2012年美国残疾人法案》。它有点像野兽,超过900页长,但他对概念进行了详细介绍,并提供了大量示例代码以提供帮助。他还为Ada 95写了一篇文章,我想。

是《美国残疾人法案》还是《老年和残疾顾问法案》?Ada是一个女人的名字,不是首字母缩略词。请注意,Ada Home非常过时,可能包含不正确的信息。为什么要使用Ada 83?它是一种比当今大多数常用语言更好的语言,但它也有一些缺点,大多数缺点在后来的语言版本中得到了解决。免费的Ada-12编译器可能适用于您使用的计算机。将Ada更改为Ada(我从未想到它可能与FORTRAN COBOL BASIC等不同!)“免费的Ada-12编译器可能适用于您使用的计算机”-我怀疑我使用的是MicroXAX(3100)!VAX的DEC Ada-95编译器实际上是GNAT,因此可能在某些地方可用。谢谢你,这是一个很好的处理方法-但是,我如何定义“可变长度字符串抽象”来完成同样的工作?这取决于你希望它们的通用性如何,以及你希望它们是有界的还是无界的。通常,您可以使用[limited]私有类型定义一个包,并定义与字符串之间的转换,以及任何其他需要的有用操作(比较、连接、切片)。Ada 83中无限抽象的一个问题是它没有终结,因此用户必须手动调用一个操作以避免内存泄漏。它也不是Ada 83,并且会泄漏内存。它怎么不是Ada83?(我在这台计算机上只有GNAT2019。)--至于内存泄漏,它只是从不释放内存,这对于全局常量表或显示如何使用私有类型和访问的“要点”的小示例来说是很好的。它不是Ada 83,因为它使用了Ada 83中不存在的未知鉴别器[“()”]。我还以为那是83年的事呢。
Table : Constant Array(Positive range <>) of String_Abstraction.DString:=
  ( String_Abstraction."+"( "This" ),
    String_Abstraction."+"( "EXAMPLE" ),
    String_Abstraction."+"( "list" ),
    String_Abstraction."+"( "exists." )
  );
Print_Table:
For Index in Table'Range Loop
    Declare
        Use String_Abstraction;
        Item : DString renames Table(Index);
    Begin
        Ada.Text_IO.Put_Line( +Item );
    End;
End loop Print_Table;
Use String_Abstraction;
Table : Constant Array(Positive range <>) of String_Abstraction.DString:=
  ( +"This",
    +"EXAMPLE",
    +"list",
    +"exists."
  );