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

时间:2014-06-10 03:30:27

标签: c pointers prolog gnu-prolog

所以基本上我的测试是在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);

但它无法工作......

有人能帮忙吗?

1 个答案:

答案 0 :(得分:0)

好的,所以这是我的临时解决方案:

interface.c函数中,我在指针上执行此掩码:

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

然后它工作正常......