所以基本上我的测试是在32位x86 Linux上进行的,我使用GNU Prolog 1.4.4
在这种情况下,我有函数ptr.c
+pro.pl
+interface.c
在ptr.c
中,我在pro.pl
中使用包装器调用Prolog
函数,然后在pro.pl
中,我使用prolog c接口调用interface.c
中的c函数,参数是c指针。
我在这里为每个文件放了一些代码:
ptr.c:
int C_wrapper_foo(int * e)
{
int return_value;
int func;
PlTerm arg[2]; // function variable + return value insert
PlBool res;
func = Pl_Find_Atom("foo"); // function name insert
Pl_Query_Begin(PL_FALSE);
printf("%pn", e);
arg[0] = Pl_Mk_Integer((unsigned int)e); // See, here I put pointer e as an arg
arg[1] = Pl_Mk_Variable();
res = Pl_Query_Call(func, 2, arg); // insert (variable+return value)
return_value = Pl_Rd_Integer(arg[1]); // insert ()
Pl_Query_End(PL_KEEP_FOR_PROLOG);
return return_value;
}
请看,我将指针e
作为参数放入Prolog中。
然后在Prolog代码中:
:- foreign(foo_c_instr(+integer)).
foo(E, FOO_RET) :-
foo_c_instr_0(E).
这只是对interface.c
文件中的c函数foo_c_instr
的调用。
PlBool foo_c_instr(int * e)
{
printf("%pn", e);
return PL_TRUE;
}
奇怪的是:
例如,指针 这太奇怪了,我已经调试了很长一段时间,但我不知道出了什么问题。。。 我用来传递指针参数的接口是: 我阅读了gnu-prolog的手册,并尝试了 但它就是不起作用。。。。 有人能帮忙吗?e
在原始ptr.c
文件中的值为0xbf9d4e4c,但在interface.c
文件中,其值变为0xff9d4e4carg[0] = Pl_Mk_Integer((unsigned int)e);
arg[0] = Pl_Mk_Positive((unsigned int)e);
arg[0] = Pl_Mk_Integer((int)e);
arg[0] = Pl_Mk_Positive((int)e);
好的,这里是我的特别解决方案:
在interface.c
函数中,我在指针上做这个掩码:
PlBool foo_c_instr(int * e)
{
e = (unsigned int)e&0xbfffffff;
printf("%pn", e);
return PL_TRUE;
}
那么它工作得很好。。。