2

Ada の完全な初心者はこちら。ここから簡単な Ada プログラムをコンパイルして実行しようとしています: http://www.dwheeler.com/lovelace/s1sf.htm

コードは次のとおりです。

-- Demonstrate a trivial procedure, with another nested inside.
with Ada.Text_IO, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Integer_Text_IO;

procedure Compute is

 procedure Double(Item : in out Integer) is
 begin -- procedure Double.
   Item := Item * 2;
 end Double;

 X : Integer := 1;   -- Local variable X of type Integer.

begin -- procedure Compute
 loop
  Put(X);
  New_Line;
  Double(X);
 end loop;
end Compute;

私は Linux を使用しており、gnat を使用しています。

gnatmake -c compute.adb
gnatmake compute

これにより、実行可能ファイルが得られます。実行可能ファイルを実行すると、X を 1 に初期化するように指示されているにもかかわらず、X を 0 に初期化するように見えるため、ゼロのリストが表示されるため、リスト 1,2,4,... を取得する必要があります。

私のコードまたは私の考えが間違っている場所を誰かが説明できますか? ああ、gnat を使用して、単一のコマンドで実行可能ファイルをコンパイルして作成する方法はありますか?

4

2 に答える 2

2

「-gnato」を追加すると、gnatmakeが単に応答gnatmake: "compute" up to date.し、同じ実行可能ファイルが残ると推測できます。

brian@Gannet:~/Ada/Play$ gnatmake -gnato compute.adb
brian@Gannet:~/Ada/Play$ ./compute
          1
          2
...
  536870912
 1073741824
raised CONSTRAINT_ERROR : compute.adb:9 overflow check failed

次に、-gnatoなしで(ソースに触れる必要があったか、「最新」のメッセージが表示されました)

brian@Gannet:~/Ada/Play$ gnatmake compute.adb
brian@Gannet:~/Ada/Play$ ./compute
          1
          2
...
  536870912
 1073741824
-2147483648
          0
          0
          0
          0

その後、ゼロの文字列として表示されます。余分な「if」ステートメントを追加すると、ファイルに影響が出て、再コンパイルが強制されます。「if」自体は厳密には必要ありません(ただし、制約エラーのテストと防止は良いことです)。

道徳:-gnatoなし、または少なくともフラグなしでは-gnataoE -fstack_check、GnatはAdaコンパイラではありません。

于 2013-03-05T10:38:49.433 に答える
0

ループ内で遅延なく毎回整数値を 2 倍にすると、すぐにオーバーフローします。GNAT では、オーバーフロー チェックはデフォルトでオフになっています-gnato。スイッチで有効にできます。したがって、整数値がオーバーフローすると、最終的に 0 になり、それが表示されます (出力が速すぎて最初の数値が表示されません)。

でコンパイルすると-gnato、実行時に制約エラーが発生するはずです。次のコマンドを実行して、1 行で実行可能ファイルを生成することもできます。

gnatmake -gnato compute.adb
于 2013-03-05T09:05:21.943 に答える