使用指针作为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("%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;
}

奇怪的是:

例如,指针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);

但它就是不起作用。。。。

有人能帮忙吗?

好的,这里是我的特别解决方案:

interface.c函数中,我在指针上做这个掩码:

PlBool foo_c_instr(int * e)
{
   e = (unsigned int)e&0xbfffffff;
   printf("%pn", e);
   return PL_TRUE;
}

那么它工作得很好。。。

相关内容

  • 没有找到相关文章

最新更新