c - 为什么这段 Prolog+C 代码失败了?

标签 c prolog ffi gnu-prolog

所以基本上我想从 Prolog 调用一些 C 代码,代码如下:

序言:

:-foreign(ptraddr_wrapper(+integer,-integer)).
:-foreign(ptrlval_wrapper(+integer,-integer)).
:-foreign(ptre_wrapper(+integer,-integer)).


% p = &b;
babelTPtr(Var, Val) :- ptraddr_wrapper(Val, Var).
% a = *p;
babelEPtr(Var, Val) :- ptre_wrapper(Val, Var).
% *p = 2;
babelLValPtr(Var, Val) :- ptrlval_wrapper(Val,Var).
% a = b;
babelAssign(Var, Val) :- Var is Val.

main :-
babelAssign(A, 1),
babelAssign(B, 2),
babelTPtr(P, A),
babelLValPtr(P, 2),
%% babelEPtr(B, P),

% print out

write(A), nl.

C:

#include </usr/local/gprolog-1.4.4/include/gprolog.h>
#include <string.h>


PlBool ptraddr_wrapper(int* ptr, int* res){
res = &ptr;
printf("%p\n", &ptr);
printf("%p\n", res);
printf("%d\n", *res);
if(res==NULL){
  return PL_FALSE;
}else{
  return PL_TRUE;
}
}

PlBool ptrlval_wrapper(int val, int* res){
   printf("%p\n", res);
   printf("%d\n", val);
   *res = val;
   printf("%d\n", *res);
if(res==NULL){
  return PL_FALSE;
}else{
  return PL_TRUE;
}
}

PlBool ptre_wrapper(int* ptr, int* res){
   *res = *ptr;
if(res==NULL){
 return PL_FALSE;
}else{
   return PL_TRUE;
   }
}

问题是,运行这段代码后,输出是:

  0xbfae8bcc       <-- it is on the stack, right
  0xbfae8bcc       <-- it is on the stack, right
   1              
  0x82abec4        <-- Why?
    2
    2

我不明白为什么第四个输出是一个新的内存地址,据我理解,它也应该是0xbfae8bcc

我错了吗?有人可以给我一些帮助吗?

最佳答案

你尝试做的事情根本不可能(这会非常危险)。在 C 部分中,res 指针是临时变量的地址,该临时变量在函数返回时应包含结果。这个结果与外部接口(interface)中相应的 Prolog 参数是统一的。您可以查看 gprolog 提供的全局变量功能,特别是 g_link/2。 see doc

关于c - 为什么这段 Prolog+C 代码失败了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22819025/

相关文章:

c - hsc2hs:用 Haskell 改变 C 结构

c - 如何在 Visual Studio 2012 中添加 Kiss FFT 并确保已添加?

c++ - C/C++ 重复符号错误

c - 为什么要使用 `extern void my_func();` 而不是包括 `my_utils.h` ?

prolog - 终止[用户]。 Prolog 中带有 EOT 字符

list - Prolog 从尾部找出列表中最大的整数

list - 使用 Prolog 折叠添加列表中的所有项目

c - C 中的类型提升,将 long 作为参数传递

用于 pdflib 的 Haskell FFI

java - German Umlaute 的问题,从 SWI Prolog 到 JAVA 的 TCPIP