传递任意大小的整数来自前导到C [英] Passing arbitrary-sized integers from Prolog to C

查看:109
本文介绍了传递任意大小的整数来自前导到C的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

现在,我正在学习如何连接SICStus的Prolog用C code。

Right now, I'm learning how to interface SICStus Prolog with C code.

我想有/使用/看C实现任意大小的整数的汉明权的序言SICStus版本4。

I would like to have/use/see a C implementation of "Hamming weight" of arbitrary-sized integers in SICStus Prolog version 4.

在我看来,我需要进行测试条款类型的C函数(SP_is_integer)和C函数访问Prolog的条款(SP_get_integer,SP_get_integer_bytes)。

It seems to me that I need C functions for testing term types (SP_is_integer) and C functions for accessing Prolog terms (SP_get_integer, SP_get_integer_bytes).

不过,我不知道如何在便携,坚固的方式使用SP_get_integer_bytes。可否请你指出我的一些精心设计的固体C $ C $ç正是这样做?

However, I'm not sure how to use SP_get_integer_bytes in a portable, robust fashion. Could you please point me to some well-crafted solid C code doing just that?

推荐答案

使用它是这样的:

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);

这篇关于传递任意大小的整数来自前导到C的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆