1

我正在努力完成一项家庭作业,并且已经到了最后一部分。首先,我将向您展示我正在处理的类型:

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。我进行了多次尝试,但经常遇到范围检查失败。谁能指出我正确的方向?

*编辑:感谢你们俩的帮助。我走的是使用无界字符串的路线,并将每个字符串附加到它,然后声明一个输出字符串并将其设置为等于无界字符串的 To_String 的常量字符串。*

4

1 回答 1

4

我给你一个提示。

理想情况下,Ada 字符串根本不像 C 或 Java 字符串那样被处理或处理。C 字符串依靠尾随的 nul (0) 字符来指定缓冲区中数据的结尾。Java 字符串会跟踪自己的长度,如果需要,会动态地重新分配自己以保持适当的长度。因此,这些语言中典型的字符串处理习语并没有考虑逐步修改字符串变量。

相反,Ada 字符串在创建时应该是完美大小的。大多数例程将假定字符串数组中的每个元素都包含有效的字符数据,并且您将数据分配到的任何目标字符串都将具有完美的大小以容纳它。如果不是这种情况,通常会引发异常(并且很可能您的程序崩溃)。

在构建字符串时,有几种方法可以解决这个问题。一种方法是创建一个非常大的字符串对象作为缓冲区,并保留一个单独的长度变量来告诉您的代码始终存在多少数据。然后,当您调用 Ada 字符串例程时,您可以只向它们提供有效字符串中的数据片段。例如:Put_line (My_New_String(1..My_String_Length));

更好的方法是只处理完美大小的常量字符串。例如,如果你想一起行动String1String2安全的 Ada 方法是:

My_New_String : constant String := String1 & String2;

String3然后,如果您以后想要一个带有附加的字符串,该字符串是:

My_New_New_String : constant String := My_New_String & String3;

有关这方面的更多信息,我建议您查看此浏览器窗口右侧“相关”标题下的一些链接。我看到里面有很多好东西。

于 2013-02-27T04:21:23.210 回答