2

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

就是这样,我有函数ptr.c++pro.plinterface.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);

但它就是行不通....

任何人都可以提供一些帮助吗?

4

1 回答 1

0

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

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

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

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

于 2014-06-10T17:58:23.400 回答