gpt4 book ai didi

调用以结构为参数的C函数

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

我坚持这个我认为很简单的问题。我有一个结构定义和一个采用该结构实例的函数。如何在Ada中调用此函数?这是一个示例代码:
define.h:

typedef struct cartesian_t
{
float x;
float y;
float z;
} cartesian_t;

void debug_cartesian(struct cartesian_t t);
define.c
void debug_cartesian(struct cartesian_t t)
{
printf("%f, %f, %f\n", t.x, t.y, t.z);
}
main.adb
with Interfaces.C; use Interfaces.C;
with Ada.Text_IO;

procedure Main is
type Cartesian_Record_Type is record
X : C_Float;
Y : C_Float;
Z : C_Float;
end record
with
Convention => C;

procedure Debug_Cartesian(Cart : in Cartesian_Record_Type)
with
Import => True,
Convention => C,
External_Name => "debug_cartesian";


T : Cartesian_Record_Type := (
X => 5.0,
Y => 1.0,
Z => -1.0
);
begin
Debug_Cartesian(T);
end Main_Union;
输出不是我期望的。它应该是“5.0、1.0,-1.0”,但是在内存中显然有些错误,因为我得到了随机值。就像是否将数据放置在C所期望的不一样的地方。

最佳答案

RM B.3中有一个实现建议,始终通过引用传递记录。至少,GNAT遵循此建议。
为了避免这种情况,您有两种选择:

  • 通过C中的引用传递结构:
  •  void debug_cartesian(struct cartesian_t *t);
    或者
  • 通过Ada中的副本传递记录:

  •     end record
    with
    Convention => C_Pass_By_Copy;

    关于调用以结构为参数的C函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67254682/

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