0

基本的に、gnu-prolog を使用して C ポインターの逆参照をシミュレートしようとしています。

コードは次のとおりです。

プロローグ

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

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

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

子:

#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 で変数のメモリ アドレスを取得することは可能ですか (たとえば、この場合、ptr のアドレスではなく、A のアドレスです)。

4

1 に答える 1

2

Gnu Prolog は、C ルーチンを作成して実行可能ファイルにリンクすることで、非常に簡単に拡張できます。しかし、「メモリ参照関係をシミュレート」しようとしている場合は、実際のメモリ アドレス関数のハッキングが役立つとは思えません。

代わりに、@lurker が示唆するように、メモリ/コンピューター アーキテクチャを「シミュレート」してから、その上で「実行」する C のような言語を使用することをお勧めします。少し野心的に聞こえるかもしれませんが、Prolog での CPU のシミュレーションについては既に質問されており、最近では lurker による回答であなたから質問されています。

于 2014-04-13T16:18:41.683 に答える