所以基本上我的测试是在 32bit 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).
这只是对文件中 c 函数的foo_c_instr
调用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);
但它就是行不通....
任何人都可以提供一些帮助吗?