SICStus Prolog 4:将整数从 Prolog 传递到 C
SICStus Prolog 4: Passing integers from Prolog to C
仍在学习 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") 传递并进行适当的动态类型检查(可能随后进行数据提取)吗?请帮忙!
我不确定,但可能是因为整数有特定的大小。基本整数在 [−32767,+32767] 范围内,长整数 [−2147483647,+2147483647] ...
你是对的,外来类型integer
对应C类型SP_integer
,只能用于小整数。对于任意大小的整数,您需要使用对应于 C 类型 SP_term_ref
的外部类型 term
,并使用 SP_get_integer_bytes()
函数来获取字节。有关详细信息,请参阅 。
您不需要显式动态类型检查,因为 SP_get_integer_bytes()
适用于所有大小的整数,如果参数不是整数,则正常失败并显示错误代码。
仍在学习 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") 传递并进行适当的动态类型检查(可能随后进行数据提取)吗?请帮忙!
我不确定,但可能是因为整数有特定的大小。基本整数在 [−32767,+32767] 范围内,长整数 [−2147483647,+2147483647] ...
你是对的,外来类型integer
对应C类型SP_integer
,只能用于小整数。对于任意大小的整数,您需要使用对应于 C 类型 SP_term_ref
的外部类型 term
,并使用 SP_get_integer_bytes()
函数来获取字节。有关详细信息,请参阅
您不需要显式动态类型检查,因为 SP_get_integer_bytes()
适用于所有大小的整数,如果参数不是整数,则正常失败并显示错误代码。