使用指针作为C调用Prolog进程的参数的奇怪情况

所以基本上我的测试是在32位x86 Linux上,我使用GNU Prolog 1.4.4

在这种情况下,我有函数ptr.c + pro.pl + interface.c

ptr.c ,我使用包装器调用pro.plProlog函数,然后在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; } 

然后它工作正常……