В основном я пытаюсь смоделировать разыменование указателя C, используя gnu-prolog.
Вот код:
Пролог
:-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 (например, в этом случае это адрес A, а не адрес ptr)?
A
? Я не думаю, что Prolog дает доступ к своим внутренним адресам, особенно через вызов функции C. Даже в случае, когда у вас есть выходной аргумент, такой какint *res
, руководство GNU говорит: ... целое число, хранящееся в этом месте, объединено с Arg., поэтому оно не выглядит прямым указателем. к переменной, которую Пролог поддерживает внутри. - person lurker   schedule 13.04.2014