从Prolog传递任意大小的整数到C

25

目前,我正在学习如何将SICStus Prolog与C代码进行接口。

我想在SICStus Prolog版本4中使用一个任意大小的整数“汉明重量”的C实现。

我认为我需要用于测试项类型(SP_is_integer)的C函数和用于访问Prolog项(SP_get_integer,SP_get_integer_bytes)的C函数。

但是,我不确定如何以可移植、健壮的方式使用SP_get_integer_bytes。您能否请指引我一些精心制作的健壮的C代码来完成此任务?


2
SP_get_integer_bytes() 用于任意精度整数。 - Per Mildner
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);

2
这适用于任何整数。这适用于任何缓冲区(例如,您可以使用通常足够大的静态缓冲区,然后在整数过大无法适应静态缓冲区时分配动态缓冲区)。 - Per Mildner

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