有可能在gnu prolog中获得这些内存地址吗?

有可能在gnu prolog中获得这些内存地址吗?,prolog,gnu-prolog,Prolog,Gnu Prolog,基本上,我尝试使用gnu prolog模拟C指针解引用 代码如下: 序言 :-foreign(fun(+integer,-integer)). % p = &b; testfun(Var, Val) :- fun(Val, Var). main :- A is 1, testfun(A, P), write(P), C: #包括 #包括 PlBool fun(内部ptr,内部*res){ *res=&ptr;//这是错误的 如果(res==NULL){ 返回plu-FALSE; }

基本上,我尝试使用gnu prolog模拟C指针解引用

代码如下:

序言

:-foreign(fun(+integer,-integer)).

% p = &b;
testfun(Var, Val) :- fun(Val, Var).

main :-
A is 1,
testfun(A, P),
write(P),
C:

#包括
#包括
PlBool fun(内部ptr,内部*res){
*res=&ptr;//这是错误的
如果(res==NULL){
返回plu-FALSE;
}否则{
返回PL_TRUE;
}
}
所以基本上它是错误的,因为ptr只是堆栈上的一个临时变量,它的内存将在调用之后释放


所以我的问题是,是否有可能在gnu prolog中获得变量的内存地址(例如,在本例中,它是A的地址,而不是ptr的地址)?

gnu prolog很容易通过它们扩展到可执行文件中。但是,如果您试图“模拟内存引用关系”,那么我怀疑黑客攻击实际内存地址函数是否有用


相反,正如@Lougler所建议的,您可能希望“模拟”内存/计算机体系结构,然后使用某种类似C的语言在其上“执行”。这听起来有点雄心勃勃,但是已经有人问过了,你也问过了,答案是潜伏者。

我认为如果它严格地说是一个输入参数,它是按值传递的,你不能从函数中获取它的指针。@潜伏者,但我们能得到“a”的内存地址吗通过其他方式?为什么您想要
A
的地址?我认为Prolog不允许访问其内部地址,特别是通过C函数调用。即使在有输出参数的情况下,比如
int*res
,GNU指南也会说,…存储在该位置的整数与Arg统一。所以它似乎不是一个指向Prolog内部维护的变量的直接指针。@Lowerer好吧……基本上我想用C来模拟变量,我必须处理指针问题。例如,我有P和a,我想用P来表示C语言中的指针,因此,我必须找到一种方法,使P存储a的内存地址。嗨,hardmath,谢谢你的回答!因为目前唯一的问题是我不知道Prolog“变量”的内存地址,所以我想我可以只维护一个Prolog“指针”和“变量”的映射。。。它似乎能解决这个问题。。我说得对吗?我的拙见是,“模拟”内存/计算机体系结构可能会被过度使用..您知道Prolog变量的内存地址的能力受到一些警告的约束。毫无疑问,您知道,所有Prolog变量都存在于可重用的stackframe中。虽然您可以调用一个以数值形式返回Prolog变量“地址”的C函数,但该地址不仅会过时,甚至在此之前,我无法理解您在程序的Prolog代码中可以使用它做什么。指针在C中很有用,很大程度上是因为它们在递归中的作用,而Prolog处理递归时不需要指针。如果目标只是说,我得到了一个Prolog变量的地址,请看一下我给出的链接Prolog和C的参考。我用过这个,一点也不困难(两种语言背景良好)。
#include <gprolog.h>
#include <string.h>

PlBool fun(int ptr, int* res){
    *res = &ptr;                  // this is wrong
    if(res==NULL){
      return PL_FALSE;
    }else{
      return PL_TRUE;
    }
}