gpt4 book ai didi

c - 如何将 C 中分配的字符串返回给 Ada 并在 Ada 中释放它?

转载 作者:行者123 更新时间:2023-12-03 16:03:05 26 4
gpt4 key购买 nike

这是 this question 的倒数。 .

我在 C 函数(特别是由 cJSON 库)中分配了一个字符串,我想将其作为输出参数返回给 Ada 调用者,并从 Ada 中释放该字符串。

C 接口(interface)如下所示:

typedef struct
{
int f1;
int f2;
// ...
} A;

int Dump_Record(const A& rec, char** outstr);
Dump_Record函数将 outstr 设置为 cJSON_Print 返回的值,它通过 malloc 分配一个字符串.

应该如何指定 Ada 绑定(bind)以及如何检索输出字符串并在 Ada 中正确释放它?

最佳答案

下面显示了用于返回 char ** 的 Ada、C 和 GPR 文件作为返回类型和 out Ada 参数。

with Ada.Text_IO; use Ada.Text_IO;
with Interfaces.C.Strings; use Interfaces.C.Strings;

procedure Str is
function Get_Str return chars_ptr with
Import => True,
Convention => C,
External_Name => "get_str";

procedure Get_Str (Str : in out chars_ptr) with
Import => True,
Convention => C,
External_Name => "get_str2";

Str : chars_ptr := Get_Str;
Str2 : chars_ptr := Null_Ptr;
begin
Get_Str (Str2);

Put ("==> " & Value (Str));
Put ("==> " & Value (Str2));

Free (Str);
Free (Str2);
end Str;

#include <malloc.h>
#include <string.h>

const char *str = "Hello, Ada\n";
const char *str2 = "This is another C string!\n";

// As a return type.
const char *get_str (void) {
char *ptr = malloc (strlen (str) + 1);

strcpy (ptr, str);

return ptr;
}

// As a return / out parameter.
void get_str2 (char **ptr) {
*ptr = malloc (strlen (str2) + 1);

strcpy (*ptr, str2);
}
project Str is
for Languages use ("C", "Ada");
for Source_Dirs use (".");
for Exec_Dir use ".";
for Main use ("str.adb");
end Str;

使用 gprbuild -P str 编译.

因此,要在 Ada 中实现您的功能:
package C renames Interfaces.C;

type A is
record
F1, F2 : C.int;
end record with
Convention => C;

function Dump_Record (Rec : aliased A; Out_Str : out chars_ptr) return C.int with
Import => True,
Convention => C,
External_Name => "Dump_Record";

显然,需要为 Rec 参数设置别名,以便编译器知道它是 C 中的引用,并且不会在其他地方重新分配它,即辅助堆栈。

关于c - 如何将 C 中分配的字符串返回给 Ada 并在 Ada 中释放它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59952682/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com