我正在努力完成一项家庭作业,直到最后一部分。首先,我将向您展示我正在处理的类型:
TYPE Book_Collection IS
RECORD
Books : Book_Collection_Array;
Max_Size : Integer;
Size : Integer;
END RECORD;
TYPE Book_Type IS
RECORD
Title,
Author,
Publisher : Title_Str;
Year : Year_Type;
Edition : Natural;
Isbn : Isbn_Type;
Price : Dollars;
Stock : Natural;
Format : Format_Type;
END RECORD;
Book_Collection_Array是book_type的数组。这些是私有类型,因此数组是有界的(1..200)。
在提供给我们的单独包中有一个名为ToString的函数,它将book_type作为输入,并返回book_type的所有元素的字符串。我需要创建的是一个函数,它将book_collection作为参数,并返回一个字符串,该字符串连接所提供的ToString函数返回的所有字符串,用于book_collection中存在的book_types。我做了多次尝试,但我不断得到范围检查失败。有人能指出我正确的方向吗?
* 修改: 谢谢你们两位的帮助。我使用了一个无界字符串的路径,并将每个字符串附加到它,然后声明一个输出字符串并将其设置为一个等于unbounded_string的To_String的常量字符串。*
答案 0 :(得分:4)
我会给你一个提示。
理想情况下,Ada字符串的处理或处理方式与C或Java字符串完全不同。 C字符串指向尾随的nul(0)字符,以指定缓冲区中的数据结尾。 Java字符串跟踪它们自己的长度,并且如果需要,将动态地重新分配自己以保持适当的长度。因此,这些语言中典型的字符串处理习惯用语并不是在逐步修改字符串变量。
Ada字符串在创建时应该是完美大小。大多数例程都假定字符串数组中的每个元素都包含有效的字符数据,并且您分配数据的任何目标字符串都将完全调整大小以容纳它。如果不是这种情况,通常会引发异常(很可能是程序崩溃)。
在构建字符串时,有几种方法可以解决这个问题。一种方法是创建一个非常大的字符串对象作为缓冲区,并保留一个单独的长度变量,以告诉您的代码始终在那里有多少数据。然后,当您调用Ada字符串例程时,您可以只从有效字符串中提取数据片段。例如:Put_line (My_New_String(1..My_String_Length));
更好的方法是处理完美大小的常量字符串。例如,如果您想要同时处理String1
和String2
,那么安全的Ada方法就是:
My_New_String : constant String := String1 & String2;
然后,如果您以后想要一个字符串,该字符串加上String3
:
My_New_New_String : constant String := My_New_String & String3;
有关这方面的更多信息,我建议您查看此浏览器窗口右侧“相关”标题下的一些链接。我在那里看到很多好东西。