2016-05-13 2 views
3

私はC関数からAda関数(C-Adaバインディングアプリケーション)に文字列を渡す必要があります。CからAdaに文字列を渡す最も良い方法

C関数:

extern void ada_func_print_string(char*); 
void Pass_String() 
{ 
    char str[] = "Hello_Ada"; 
    ada_func_print_string(str); 
} 

エイダ機能:

仕様:

pragma Export (Convention => C, 
       Entity  => Ada_Print_String, 
       External_Name => "ada_func_print_string"); 

ボディ:

procedure Ada_Print_String (C_Source : Interfaces.C.char_array) 
    Ada_Str : String := Interfaces.C.To_Ada(Item  => C_Source, 
              Trim_Nul => True); 
begin 
    Ada.Text_IO.Put_Line(Ada_Str);  
end Ada_Print_String; 

上記のコードはかなり任意の手間をかけずに正常に動作します。私が持っている疑問は、仮パラメータの宣言はC_SOURCEInterfaces.C.char_arrayことが良いですか、それはより良いInterfaces.C.Strings.chars_ptrあるべきかどうか?このアプリケーションに関する2つの違いは何ですか?ここにはこの2つのタイプの中で致命的なことがありますか?

+0

本当に助かりました! –

答えて

3

Ada 95 Rationale, §B.2 C Interface Package, §B.2.2 Stringsはこれに関するいくつかの展望を提供するかもしれません。 Interfaces.Cはパッケージで、のタイプとサブプログラムを提供し、AdaサブプログラムがC文字列を受け入れることができることに注意してください。対照的に、Interfaces.C.Stringsでは、プライベートタイプchars_ptrを介して「AdaプログラムがCスタイルの文字列を割り当て、参照し、更新し、解放する」ことができます。あなたの例では、Cコンパイラmustは、文字列リテラルにヌル終端文字を追加しますが、誤ったCプログラムがいたずらを作成する可能性があります。

char str[] = {'H','e','l','l'}; 

結果コードがTerminator_Errorを処理していることを確認します。

関連する問題