【问题标题】:How to bind a delayed out parameter?如何绑定延迟输出参数?
【发布时间】:2013-10-10 20:21:37
【问题描述】:

通常 C API 指针在 Vala 绑定中被转换为 arraysout 参数:

// C
void get_user_name (char *buffer, int buffer_length);
void get_user_count (int *count_ptr);
// Vala
public static void get_user_name (uint8[] buffer);
public static void get_user_count (out int count);

我现在遇到了一个使用指针作为延迟out 参数的情况。

// C
void bind_buffer (void *buffer, int buffer_length, int *length);
int fetch (void);

每次调用fetch (),数据都会传输到bufferlength

在 Vala 中绑定此类 API 的最佳方式是什么?

// Vala
public static void bind_buffer (uint8[] buffer, int *length);
public static int fetch ();

我觉得我不能在这里使用out int length

此外,我还必须确保绑定的数据在整个绑定期间都可用。我怎样才能做到这一点?

【问题讨论】:

    标签: vala vapi


    【解决方案1】:

    最后一个例子你基本上是对的。 CCode 注释有点偏离(array_length 默认为 true,您不需要包含它,并且 array_pos 不存在。有 array_length_pos,但同样,它实际上不是必需的,因为默认值可以正常工作)。在这种情况下,指针确实是获取长度的唯一方法。

    至于确保数据可用,C API 似乎没有为您提供执行此操作的方法。通常这可以通过转移所有权来实现,但这需要 C API 提供一种在不再需要时自动销毁/取消引用数据的方法。您唯一能做的就是尝试确保 VAPI 使用者了解他们要求数据在需要时保持活动状态。

    Vala 往往与设计良好的 C API 一起工作得很好,但是当使用设计不佳的 C API 时,并不总是可以创建一个好的 Vala API。您唯一真正的选择是改进 C 库或编写一个包装器库(在 C 或 Vala 中)代理对 C API 的调用,同时提供更健全的 API。

    【讨论】:

    • 我删除了我的问题的 CCode 属性,因为它们在这里不相关(如您所写)。
    • API 中还有更疯狂的东西(比如 void* 会根据类型参数获取其他指针):\
    • 您可能希望对这些使用泛型,或者可能为每种类型创建一个具有类型参数默认值的版本。​​
    猜你喜欢
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    相关资源
    最近更新 更多