8

そのように実行時に決定されるサイズの配列を持つことは可能ですか?

Procedure prog is
   type myArray is array(Integer range <>) of Float;
   arraySize : Integer := 0;
   theArray : myArray(0..arraySize);
Begin
   -- Get Array size from user.
   put_line("How big would you like the array?");
   get(arraySize);

   For I in 0..arraySize Loop
      theArray(I) := 1.2 * I;
   End Loop;
End prog;

動的にリンクされたリストまたは別の同様の構造を使用する以外に、この結果を達成する方法はありますか? または、動的にリンクされたリストを使用するよりも単純な組み込みのデータ構造がありますか?

4

2 に答える 2

8

確かに、次のようにブロックで宣言します。

procedure prog is
   arraySize : Integer := 0;
   type myArray is array(Integer range <>) of Float;
begin
   -- Get Array size from user.
   put_line("How big would you like the array?");
   get(arraySize);

   declare
      theArray : myArray(0..arraySize);
   begin
      for I in 0..arraySize Loop
         theArray(I) := 1.2 * I;
      end Loop;
   end;
end prog;

または、arraySize を引数としてサブプログラムに渡し、そのサブプログラムでそれを宣言して操作します。

procedure Process_Array (arraySize : Integer) is

    theArray : myArray(0..arraySize);

begin
   for I in arraySize'Range Loop
      theArray(I) := 1.2 * I;
   end Loop;
end;

無効な配列サイズなどに対処する必要があるため、これは単なる例示です(コンパイルされていません:-)。

于 2012-12-06T01:46:12.710 に答える
1

はい、サイズがわかるまで、制約付きオブジェクトの宣言を延期できます。このでは、配列Candidatesはネストされたブロック (キーワードで導入declare) またはヒープ (キーワードを使用)に割り当てることができますnew。この関連するLineは、 のサイズはループのたびに異なりGet_Lineます。

于 2012-12-06T01:47:33.090 に答える