5

開始点と終了点を持つ範囲を使用して、 Adaでfor ループを実行できます。

for I in 0..10 loop
(...)
end loop;

範囲を表す 2 つの変数を使用してfor ループを実行できることはわかっています。

for I in range_start..range_end loop
(...)
end loop;

次のように、範囲を1 つの変数に格納することもできますか?

for I in my_range loop
(...)
end loop;

変数 *my_range* の型はどれですか?

編集:この変数をサブプログラムのパラメーターとして使用したいとしましょう:したがって、サブプログラムには、範囲を反復するこのループがあります。ジェネリックを使用する代わりに、範囲を記述する 2 つの変数を使用したいと思います。しかし、範囲を表す 1 つの変数を使用すると読みやすくなると思います。そのため、その質問をしています。

4

5 に答える 5

3

変数が配列の場合、次の方法でその範囲を反復処理できます。

for I in Arr_Var'Range loop
   ...
end loop;

配列、ベクトル、マップなどのコンテナーの要素を反復処理することに関心があり、インデックスを気にしない場合は、一般化されたループを使用できます(Ada 2012のみ)。

for Elem of Container loop
   ...
end loop;
于 2013-01-21T16:01:16.363 に答える
2

range次のようなタイプを使用します。

type Range_Type is range -5 .. 10;
...
for A in Range_Type loop

ここの完全な例を参照してください。

于 2013-01-21T15:52:17.340 に答える
1

私の計算によると、一般的なサブプログラムを作成するには、単純なサブプログラムよりも 4 行多く必要です。

generic                             -- extra
   type Bounds is (<>);             -- extra
procedure R;

procedure R is
begin
   for J in Bounds'Range loop
      null;
   end loop;
end R;

with R;
procedure P is
   type Rng is range 1 .. 10;       -- extra
   procedure A is new R (Rng);      -- extra
begin
   A;
end P;

それほど悪くはないようです。

しかし、通常、反復は何か(配列など) を反復します。その場合、反復されているものから反復範囲を導き出すことができます。

于 2013-01-23T17:18:20.717 に答える
1

うーん。あなたは (おそらく無意識のうちに) Andrei Alexandrescuの信奉者のようです。彼は、言語が範囲をファースト クラスの型にすること、およびプログラミング パラダイムとしての「イテレータ」を削除することを強く主張しています。

これの Ada 実装がどのようになるかを見るのは興味深いでしょう。何かが欠けていない限り、それは Ada 2012 のやり方ではありません。

于 2013-01-22T20:57:27.960 に答える
1

範囲を含むオブジェクトを渡したい場合は、Start と End をレコードでラップできます。サブプログラム内で、範囲で区切られた新しい [サブ] タイプをローカルに宣言できます。

type Range_Type is range TheRange.Start .. TheRange.end;
于 2013-01-22T21:28:14.003 に答える