【问题标题】:Is it possible to get these memory addresses in gnu prolog?是否可以在 gnu prolog 中获取这些内存地址?
【发布时间】:2014-04-13 01:17:55
【问题描述】:

基本上我正在尝试使用 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:

#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;
    }
}

所以基本上是错的,因为ptr只是栈上的一个临时变量,调用fun后它的内存会被释放。

所以我的问题是,是否可以在gnu prolog中获取变量的内存地址(例如,在这种情况下,它是A的地址,而不是ptr的地址)?

【问题讨论】:

  • 我认为如果它严格来说是一个输入参数,它是按值传递的,你不能从函数中获取它的指针。
  • @lurker 但是我们可以通过其他方式获取“A”的内存地址吗?
  • 为什么要A的地址?我不认为 Prolog 可以访问其内部地址,尤其是通过 C 函数调用。即使在你有一个像int *res 这样的输出参数的情况下,GNU 指南说,...存储在这个位置的整数与 Arg 是统一的。 所以它似乎不是指向 Prolog 内部维护的变量的直接指针。
  • @lurker 嗯....基本上我想在C中使用A模拟变量,我必须处理指针问题..
  • 比如我有P和A,想用P来表示C语言中的指针,所以必须想办法让P存储A的内存地址。跨度>

标签: prolog gnu-prolog


【解决方案1】:

Gnu Prolog 很容易通过writing C routines and linking 扩展为可执行文件。但是,如果您尝试“模拟内存引用关系”,那么我怀疑在实际内存地址函数中进行黑客攻击是否有用。

相反,正如@lurker 所建议的那样,您可能想要“模拟”内存/计算机架构,然后在其上“执行”一些类似 C 的语言。听起来有点野心勃勃,但simulation of a CPU in Prolog 已经被问过了,more recently here 是你问的,还有 lurker 的回答。

【讨论】:

  • 您好 hardmath,谢谢您的回答!因为目前唯一的问题是我不知道Prolog“变量”的内存地址,所以我想我可以只维护一个Prolog“指针”和它们指向的“变量”的映射......似乎能够解决问题..我说的对吗?
  • 以我的拙见,“模拟”内存/计算机体系结构可能是矫枉过正..
  • 您知道 Prolog 变量的内存地址的能力受到一些警告。正如您无疑知道的那样,所有 Prolog 变量都存在于可以重用的堆栈帧中。虽然您可以调用一个将 Prolog 变量的“地址”作为数值返回的 C 函数,但该地址不仅会变得过时,甚至在此之前我无法理解您可以在程序的 Prolog 代码中使用它做什么.指针在 C 中很有用,很大程度上是因为它们在递归中的作用,而 Prolog 处理递归时不需要指针。
  • 如果目标只是说,我得到了一个 Prolog 变量的地址,看看我给出的链接 Prolog 和 C 的参考。我用过这个,它不是都很困难(考虑到两种语言的良好背景)。
猜你喜欢
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
相关资源
最近更新 更多