25

现在,我正在学习如何将 SICStus Prolog 与 C 代码接口。

我想在 SICStus Prolog 版本 4 中拥有/使用/查看任意大小整数的“汉明权重”的 C 实现。

在我看来,我需要 C 函数来测试术语类型(SP_is_integer)和 C 函数来访问 Prolog 术语(SP_get_integer、SP_get_integer_bytes)。

但是,我不确定如何以可移植、健壮的方式使用 SP_get_integer_bytes。你能指点我一些精心设计的可靠的 C 代码吗?

4

1 回答 1

14

像这样使用它:

SP_term_ref tr = ... some term ...
int native = 0; // want portable, little endian
size_t buf_size = 0;

if (!SP_get_integer_bytes(tr, NULL, &buf_size, native)
    // if buf_size was updated, then there was not really an error
    && buf_size == 0)
{
    // Something wrong (e.g., not an integer)
    return ERROR;
}

// here buf_size > 0
void *buffer = SP_malloc(buf_size);

if (buffer == NULL)
{
    return ERROR;
}

if (!SP_get_integer_bytes(tr, buffer, &buf_size, native))
{
    // Something wrong. This would be surprising here
    error();
}

// Here buffer contains buf_size bytes, in
// twos-complement, with the least significant bytes at lowest index.
// ... do something with buffer ...

// finally clean up
SP_free(buffer);
于 2015-03-03T16:02:03.207 回答