所以基本上我的测试是在32位x86 Linux上,我使用GNU Prolog 1.4.4
以下是这种情况,我的功能ptr.c
+ pro.pl
+ interface.c
在ptr.c
中,我使用包装器调用Prolog
中的pro.pl
函数,然后在pro.pl
中使用prolog c接口调用C函数在interface.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("%p\n", 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).
这只是对foo_c_instr
文件中c函数interface.c
的调用。
PlBool foo_c_instr(int * e)
{
printf("%p\n", e);
return PL_TRUE;
}
奇怪的是:
例如,原始e
文件中指针ptr.c
的值为 0xbf9d4e4c ,但是,在interface.c
文件中,其值变为 0xff9d4e4c !!!
这太奇怪了,我调试了很长一段时间,但我不知道出了什么问题......
我用来传递指针参数的接口是:
arg[0] = Pl_Mk_Integer((unsigned int)e);
我阅读了gnu-prolog的手册,并尝试了
arg[0] = Pl_Mk_Positive((unsigned int)e);
arg[0] = Pl_Mk_Integer((int)e);
arg[0] = Pl_Mk_Positive((int)e);
但它无法工作......
有人能帮忙吗?
答案 0 :(得分:0)
好的,所以这是我的临时解决方案:
在interface.c
函数中,我在指针上执行此掩码:
PlBool foo_c_instr(int * e)
{
e = (unsigned int)e&0xbfffffff;
printf("%p\n", e);
return PL_TRUE;
}
然后它工作正常......