无法打印字符串常量数组字符串的内容?
Unable to print the contents of an Array String of String Constants?
我是 Ada 的初学者,我正在尝试声明和使用不同长度的字符串数组。
使用 Ada'83,我可以声明一个可变长度字符串常量数组,如下所示(示例取自 Ada FAQ)
type table is access String;
TESTS : constant array (Positive range 1..3) of table
:= ( 1 => new String'("One"),
2 => new String'("Two"),
3 => new String'("Three")
);
尽管结果看起来是一组字符数组,但令我感到沮丧的是,它们的行为并不像字符串。当我尝试编译以下代码时,我收到一条错误消息 'Inconsistency detected during overload resolution [LRM 8.7]'
for COUNT in TESTS'Range loop
Put(TESTS(COUNT));
New_Line;
end loop;
不过,我可以使用下面的代码打印出每个 'strings' 的内容。
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 中迭代一个变长的字符串常量数组,或者将字符数组转换为变长的字符串。
谢谢
不,这不是作业,是的,我知道我使用的是一个古老的编译器!
Test
未定义;我假设你的意思是 Tests
.
Table
不是字符串类型;它是一种访问类型。要引用访问值指定的值,可以使用 .all
:
Tests (Tests'First).all
是一个字符串。 Ada 包含一些访问数组类型的快捷方式,使它们更易于使用,允许在属性和索引之前省略 .all
,这就是 Tests (Count)'Range
和 Tests (Count) (Counter)
起作用的原因。但是,要引用整个值,需要 .all
:
Text_IO.Put_Line (Item => Tests (Counter).all);
但是,更好的方法是定义可变长度字符串抽象并使用它来代替访问类型。
Thank you that works a treat - however, how would I go about defining
'a variable-length string abstraction' to do the same job?
使用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;
实施:
Package Body String_Abstraction is
Type Data( Length : Natural ) is record
Text : String(1..Length) := (others => ASCII.NUL);
end record;
Function "+"( Right : String ) return DString is
Begin
Return New Data'( Text => Right, Length => Right'Length );
End "+";
Function "&"( Left, Right : String ) return DString is
Begin
Return +(Left & Right);
End "&";
Function "+"( Right : DString ) return String is
Begin
Return Right.Text;
End "+";
--...
End String_Abstraction;
可以这样使用:
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;
如果您在声明 table 之前有一个 use
,您可以:
Use String_Abstraction;
Table : Constant Array(Positive range <>) of String_Abstraction.DString:=
( +"This",
+"EXAMPLE",
+"list",
+"exists."
);
它当然不完整,但它为您提供了如何操作的基本概念。
GNAT Studio Community Edition 可供自由职业者和爱好编码的人免费使用。它预装了一个不错的 Ada 2012 编译器。我还必须安装一个名为 Ada GDE 的小插件来获取 运行.
的代码
如果您正在寻找最新的书籍来学习,我强烈推荐 john Barnes 的 Ada 2012。这本书长达 900 多页,有点像野兽,但他详细介绍了概念并提供了大量示例代码来提供帮助。我相信他还为 Ada 95 写了一篇。
我是 Ada 的初学者,我正在尝试声明和使用不同长度的字符串数组。
使用 Ada'83,我可以声明一个可变长度字符串常量数组,如下所示(示例取自 Ada FAQ)
type table is access String;
TESTS : constant array (Positive range 1..3) of table
:= ( 1 => new String'("One"),
2 => new String'("Two"),
3 => new String'("Three")
);
尽管结果看起来是一组字符数组,但令我感到沮丧的是,它们的行为并不像字符串。当我尝试编译以下代码时,我收到一条错误消息 'Inconsistency detected during overload resolution [LRM 8.7]'
for COUNT in TESTS'Range loop
Put(TESTS(COUNT));
New_Line;
end loop;
不过,我可以使用下面的代码打印出每个 'strings' 的内容。
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 中迭代一个变长的字符串常量数组,或者将字符数组转换为变长的字符串。
谢谢
不,这不是作业,是的,我知道我使用的是一个古老的编译器!
Test
未定义;我假设你的意思是 Tests
.
Table
不是字符串类型;它是一种访问类型。要引用访问值指定的值,可以使用 .all
:
Tests (Tests'First).all
是一个字符串。 Ada 包含一些访问数组类型的快捷方式,使它们更易于使用,允许在属性和索引之前省略 .all
,这就是 Tests (Count)'Range
和 Tests (Count) (Counter)
起作用的原因。但是,要引用整个值,需要 .all
:
Text_IO.Put_Line (Item => Tests (Counter).all);
但是,更好的方法是定义可变长度字符串抽象并使用它来代替访问类型。
Thank you that works a treat - however, how would I go about defining 'a variable-length string abstraction' to do the same job?
使用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;
实施:
Package Body String_Abstraction is
Type Data( Length : Natural ) is record
Text : String(1..Length) := (others => ASCII.NUL);
end record;
Function "+"( Right : String ) return DString is
Begin
Return New Data'( Text => Right, Length => Right'Length );
End "+";
Function "&"( Left, Right : String ) return DString is
Begin
Return +(Left & Right);
End "&";
Function "+"( Right : DString ) return String is
Begin
Return Right.Text;
End "+";
--...
End String_Abstraction;
可以这样使用:
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;
如果您在声明 table 之前有一个 use
,您可以:
Use String_Abstraction;
Table : Constant Array(Positive range <>) of String_Abstraction.DString:=
( +"This",
+"EXAMPLE",
+"list",
+"exists."
);
它当然不完整,但它为您提供了如何操作的基本概念。
GNAT Studio Community Edition 可供自由职业者和爱好编码的人免费使用。它预装了一个不错的 Ada 2012 编译器。我还必须安装一个名为 Ada GDE 的小插件来获取 运行.
的代码如果您正在寻找最新的书籍来学习,我强烈推荐 john Barnes 的 Ada 2012。这本书长达 900 多页,有点像野兽,但他详细介绍了概念并提供了大量示例代码来提供帮助。我相信他还为 Ada 95 写了一篇。