从Ada函数传递字符串到C函数

4

Ada的字符串不像C那样以null结尾。在一个C-Ada绑定应用程序中,我有一个需求,需要将在Ada代码中分配的字符串传递给C函数。那么C如何识别这里的Ada字符串,因为在C中,字符串通常是简单的char数组,以null字符结尾,而在Ada中并非如此?

如果有示例,将不胜感激!


1
请查阅您的手册:http://www.ada-auth.org/standards/aarm12_w_tc1/html/AA-B-3.html - ikrabbe
1
将ADA字符数组连同其长度传递给strncpy(newstr, ada_str, length);,并显式终止newstr,例如newstr[length] = 0;。或者,如果您在C代码中拥有ada字符串和长度,并且可以使用相同的变量,则只需终止ada_string,例如adastring[length] = 0;(或者如果ada从1而不是0开始索引,则adastring[length+1] = 0;(只要有存储空间添加nul-terminator) - David C. Rankin
1
大部分是与您自己的问题重复的内容 http://stackoverflow.com/questions/35911763/passing-strings-in-c-ada-binding-application - manuBriot
1个回答

3
扩展@manuBriot对您先前关于此主题的问题回答,请注意方便的包装器procedure Foo在传入的Ada String上调用New_String以获取chars_ptr
procedure Foo (C : String) is
   S : Interfaces.C.Strings.chars_ptr := New_String (C);
beginend Foo;

请注意,New_String“等同于New_Char_Array(To_C(Str))”。当传递一个Ada String时,To_C默认将Append_Nul设置为True。因此,Ada Foo使用正确的null终止的C字符串调用C foo

如果我在ADA中分配了一个字符串,在C端使用完该字符串后,如何释放内存? - Akay
1
@AKay:参考上面省略的codeFree(S)将释放由New_String分配给char_array的存储空间。 - trashgod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接