-2

基本的に、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.

子:

#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

4 番目の出力が新しいメモリ アドレスである理由がわかりません。私の理解では、それも0xbfae8bccである必要があります。

私が間違っている?誰か助けてくれませんか?

4

1 に答える 1