使用指针作为C调用Prolog进程的参数的奇怪情况
所以基本上我的测试是在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("%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).
这只是对interface.c
文件中c函数foo_c_instr
的调用。
PlBool foo_c_instr(int * e) { printf("%p\n", e); return PL_TRUE; }
奇怪的是:
例如,原始ptr.c
文件中指针e
的值是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);
但它无法正常工作….
有人可以帮忙吗?
好的,所以这是我的临时解决方案:
在interface.c
函数中,我在指针上执行以下掩码:
PlBool foo_c_instr(int * e) { e = (unsigned int)e&0xbfffffff; printf("%p\n", e); return PL_TRUE; }
然后它工作正常……