2016-09-29 7 views
1

моей целью является изменение глобальной переменной C.Common Lisp & CFFI: изменение глобальной переменной

Предполагая, что у меня есть следующий заголовочный файл C:

/* test.h */ 
int global_variable; 

и исходный файл C:

/* test.c */ 
#include "stdio.h" 
#include "test.h" 

extern int global_variable; 
void test(void) { 
    FILE *fp; 
    fp = fopen("output.txt", "w"); 
    fprintf(fp, "Global variable: %d\n", global_variable); 
} 

global_variable правильно отображается внутри общей библиотеки, порожденного

gcc -c -fPIC test.c 
gcc -shared -o libtest.so test.o 

Мой интерфейс lisp выглядит так:

(ql:quickload :cffi) 

(cffi:define-foreign-library libtest 
    (:unix (:default "./libtest")) 
    (t (:default "./libtest"))) 

(cffi:use-foreign-library libtest) 

(cffi:defcvar ("global_variable" *global-variable*) :int) 

(cffi:defcfun "test" :void) 

Я могу назвать тест без ошибок, но я не могу изменить global_variable с

(setf *global-variable* 42) 

я получаю предупреждение неопределенной переменной, а затем определяет (я предполагаю) новую переменную.

Итак, вопрос в том, как изменить global_variable в общем lisp (sbcl)?

Спасибо заранее!

+0

Я мог бы написать функцию C, например, void set_g (int g) {global_variable = g;}, установив global_variable, а затем напишите интерфейс в общем lisp для set_g. Но я полагаю, что должен быть другой путь. – Dimitris

+1

Кажется, это работает для меня после того, как я добавил отсутствующую функцию fclose (fp); 'в функцию C. – jkiiski

+0

Большое вам спасибо! – Dimitris

ответ

0

для вашей структуры, что-то, как это должно работать:

(cffi:with-foreign-object (ptr 'block) 
     ;; setf the slots 
     (setf (cffi:foreign-slot-value ptr 'block 'a) 12) ...etc.