2

仕様ファイルを可能な限り「一定」に保つために、いくつかの「ユーザー定義のコンパイラ定数」を宣言したいと思います。これはC++で一般的なものです。例:

// misc/config.hh
namespace misc
{
  typedef std::shared_ptr<A> A_ptr; 
  namespace arch = ibmpc;
}

// misc/code.hh
#include "misc/config.hh"
namespace misc
{
  void function p(A_ptr a);
}

どちらがエイダになりますか:

-- misc.ads
package Misc is
  use Types; ----> forbidden !

  procedure P(A : A_Access);
end Misc;

-- misc-types.ads
package Misc.Types is
  type A_Access is A'Access;
end Misc.Types;

もちろん、これはuseコンテキストキーワードであるため機能しません...したがって、私の質問:Adaで同じ結果で何かを行うことはどのように可能ですか?

4

3 に答える 3

3

これは、C++オリジナルからAdaへの妥当なマッピングだと思います。

そもそも、多かれ少なかれ、あなたnamespace miscの、ファイル内misc.adsで、

package Misc is
end Misc;

次に、に対応してconfig.hh、ファイル内misc-config.adsで、

package Misc.Config is
   type A is (For_Example, An_Enumeration);
   type A_Access is access A;
end Misc.Config;

(もちろん、の型を参照することもできますMisc)。次に、に対応してcode.hh、ファイル内misc-code.adsで、

with Misc.Config;
package Misc.Code is
   use Config;
   procedure P (A : A_Access);
end Misc.Code;

個人的にはuse Config;、仕様ではとにかく、そうはしません。何かが定義されている場所を見つけるのが難しくなる可能性があります。;の子にいるので、表示されている場所で言うことができますuse Config;。コンテキスト句では、これもOKですが、する必要があります。use Misc.Config;Miscuse Misc.Config;

于 2012-05-09T12:17:31.153 に答える
1

わかりました。あなたがやろうとしていることを私が見ている間、あなたはそれについて間違っているのです。与えられたスニプレットであなたが抱えている問題はこれです:循環依存。

現在、Adaは、仕様と本体を使用して循環依存を(ある意味で)非循環にすることにより、循環依存を管理する優れた方法を備えています。2つは個別であるため、仕様が公開されているため、本体が他方の仕様を参照する2セットの仕様/本体ファイルを作成できます。

例として、確かにばかげています。万年筆とインクカートリッジを使いましょう。

With Cartridge;
Package Pen is

  Subtype Model_Number is Positive Range 1000..3304;
  Type Fountain_pen is private;
  -- Pen procedures
private
  Type Fountain_pen is Record
 Model  : Model_Number;
     Ink    : Cartridge.Ink_Cartridge;
  end record;      
end Pen;

With Pen;
Package Cartridge is
  Type Ink_Cartridge is private;
  -- Ink procedures
private
  Type Ink_Cartridge is record
     Color      : Integer; -- I'm being lazy.
     This_Pen   : Pen.Fountain_pen;
  end record;
end Cartridge;

Package Body Pen is
  --- Pen Stuff
end Pen;

Package Body Cartridge is
  -- Ink stuff
end Cartridge;

(コンパイルされていません。)しかし、循環ネスト型のコンポーネントを作成する方法を忘れています...とにかく、そこで一般的な考え方を理解する必要があります。しかし、あなたが望んでいるのは、相互に依存する型とは根本的に異なります。あなたが欲しいのはあなたの定数のためのある種のコンテナです。

子パッケージの使用をお勧めします。のようなMiscものMisc.Constants; ここで、ベースタイプをMiscに配置し、定数をMisc.Constantsに配置します。タイプが定数に依存している場合は、それら用に別の子パッケージを作成しMisc.Types、上記のように相互のwithingを使用できます。

于 2012-05-03T16:17:30.927 に答える
1

次のように、子パッケージの仕様を親パッケージの仕様の中に入れることができます。

package Misc is
   package Types is
      type A is private;
      type A_Access is access A;
      -- other stuff
   end Types;

   procedure P (A : Types.A_Access);
end Misc;

use Types;の宣言後でもできますMisc.Types

于 2012-05-04T06:34:12.853 に答える