SICStus Prolog 4:将整数从Prolog传递到C

时间:2015-03-18 21:38:47

标签: c prolog ffi sicstus-prolog

仍在学习SICStus Prolog 4 FFI到C的绳索,我对https://sicstus.sics.se/sicstus/docs/latest4/html/sicstus.html/Foreign-Code-Examples.html#Foreign-Code-Examples中的示例谓词c1 / 2有一个特定的问题。

ex.pl包括以下行:

 foreign(c1,  c, c1(+integer, [-integer])).

和ex.c包含以下代码段:

 /* c1(+integer, [-integer]) */
 SP_integer c1(a)
 SP_integer a;
 {
    return(a+9);
 }

这适用于小整数:

 | ?- c1(100,X).
 X = 109 ?
 yes
 | ?- c1(100000000000000,X).
 X = 100000000000009 ?
 yes

它不适用于大整数:

 | ?- c1(10000000000000000000000000,X).
 X = 1590897978359414793 ? 
 yes

如何正确(高效)处理小整数和大整数? IIRC大整数不能作为“SP_integers”传递,所以我应该将这些值作为术语(“SP_term_ref”)传递并进行适当的动态类型检查(可能后跟数据提取)?求救!

2 个答案:

答案 0 :(得分:3)

你是对的,外来类型integer对应于C类型SP_integer,只能用于小整数。对于任意大小的整数,您需要使用对应于C类型term的外部类型SP_term_ref,并使用SP_get_integer_bytes()函数来获取字节。有关详情,请参阅Passing arbitrary-sized integers from Prolog to C

您不需要显式动态类型检查,因为SP_get_integer_bytes()适用于所有大小的整数,如果其参数不是整数,则优雅地失败并显示错误代码。

答案 1 :(得分:1)

我不确定,但也许是因为整数具有特定的大小。基本整数的范围是[-32767,+ 32767],长整数[-2147483647,+ 2147483647] ......