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 をパラメーターとして取り、その book_collection に存在する book_types に対して、提供された ToString 関数によって返されるすべての文字列を連結した文字列を返す関数です。複数回試行しましたが、範囲チェックの失敗が常に発生しています。誰かが私を正しい方向に向けることができますか?

*編集:ご協力いただきありがとうございます。私は、無制限の文字列を使用し、それに各文字列を追加してから、出力文字列を宣言し、それを unbounded_string の To_String に等しい定数文字列として設定するというルートをたどりました。

4

1 に答える 1

4

ヒントをあげます。

Ada 文字列は、理想的には、C や Java の文字列のように扱われたり処理されたりすることはまったくありません。C 文字列は、末尾のヌル (0) 文字をカウントして、バッファー内のデータの終わりを指定します。Java 文字列は独自の長さを追跡し、必要に応じて適切な長さを維持するために動的に再割り当てします。そのため、これらの言語の典型的な文字列処理イディオムは、文字列変数を段階的に変更することを何も考えていません。

代わりに、Ada 文字列は、作成時に完全なサイズであることが期待されます。ほとんどのルーチンは、文字列配列のすべての要素に有効な文字データが含まれていると想定し、データを割り当てる宛先文字列は、それを保持するのに完全なサイズになります。そうでない場合は、通常、例外が発生します (そして、ほとんどの場合、プログラムがクラッシュします)。

文字列を作成するときに、これに対処する方法はいくつかあります。1 つの方法は、非常に大きな文字列オブジェクトをバッファーとして作成し、別の長さ変数を保持して、コードに常に実際にどれだけのデータが含まれているかを伝えることです。次に、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;

詳細については、このブラウザ ウィンドウの右側にある [関連] という見出しの下にあるリンクのいくつかを参照することをお勧めします。私はそこにたくさんの良いものを見ます。

于 2013-02-27T04:21:23.210 に答える