Zbudowałem bibliotekę zabawek C++, aby szybko utworzyć okno Qt z Lisp. Wiem, że common-qt istnieje, próbuję tylko nauczyć się korzystać z cffi.Lisp, cffi, let and memory
Teraz mam 4 binded funkcje:
- tworzenie-aplikacji: tworzenie QApplication i zwraca wskaźnik
- create-okno: stworzyć QMainWindow i zwracają poiner
- Pokaż: Pokaż okno określony jako argument
- exec: Qt funkcja exec
Oto LISP kod, który działa perfec tly:
(defctype t-app :pointer)
(defctype t-window :pointer)
(defcfun (create-application "create_application") t-app)
(defcfun (exec "exec") :void (app t-app))
(defcfun (create-window-aalt "create_window_aalt") t-window)
(defcfun (show "show") :void (o t-window))
(defparameter a (create-application))
(defparameter w (create-window-aalt))
(show w)
(exec a)
Ale jeśli użyję LET lub LET * ... Mam błąd pamięci!
(let* ((a (create-application)) (w (create-window-aalt)))
(show w)
(exec a))
CORRUPTION WARNING in SBCL pid 1312(tid 140737353860992):
Memory fault at a556508 (pc=0x7ffff659b7f1, sp=0x7ffff2bbe688)
The integrity of this image is possibly compromised.
Exiting.
Czy ktoś wie, dlaczego?
Używam SBCL:
env LD_LIBRARY_PATH=`pwd` \
env LD_PRELOAD=/usr/lib/libQtGui.so.4 \
sbcl --script aalt.lisp
Dzięki.
Dzięki za odpowiedź! Już używam extern "C", możesz spojrzeć na mój kod tutaj: http://pastebin.archlinux.fr/464826 Cóż, działa on w Lispie, jeśli używam defragametru i nie pozwalam, więc myślę, że to nie jest to wyjątek C++ ... ale i tak spróbuję, a dam ci znać. – Filippo
dzięki, to działa! Ale tylko z Clisp, nadal mam ten sam błąd z SBCL. Jakaś wskazówka? – Filippo