2016-05-13 78 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_Source的声明是否是好得Interfaces.C.char_array,或者最好是Interfaces.C.Strings.chars_ptr?两者在这个应用方面有什么区别?在这里使用这两种类型有没有死亡?

+0

太棒了,它真的帮助! –

回答

3

Ada 95 Rationale, §B.2 C Interface Package, §B.2.2 Strings可能会提供一些这方面的观点。请注意,Interfaces.C是一个pure程序包,它提供允许Ada子程序接受C字符串的基本类型和子程序。相比之下,Interfaces.C.Strings允许“Ada程序通过私有类型chars_ptr分配,引用,更新和释放C风格的字符串”。在你的例子中,C编译器must将一个空终止符附加到你的字符串文字中,但是对于错误的C程序来说可能会造成恶作剧。

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

验证您的代码是否处理结果Terminator_Error