2013-07-10 9 views
6

Ich habe einige Spielzeug C++ Bibliothek gebaut, um schnell ein Qt-Fenster von Lisp zu erstellen. Ich weiß, dass common-qt existiert, ich versuche nur zu lernen, wie man cffi benutzt.Lisp, cffi, let and memory

Gerade jetzt, ich habe 4 binded Funktionen:

  • create-Anwendung: eine QApplication erstellen und liefern einen Zeiger
  • erstellen Fenster: eine QMainWindow erstellen und geben einen poiner
  • zeigen: anzeigen das Fenster als Argument angegeben
  • exec: Qt exec Funktion

Hier ist ein Lisp-Code, die Arbeit perfec tly:

Aber wenn ich LET oder LET * verwende ... habe ich einen Speicherfehler!

(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. 

Weiß jemand warum?

I SBCL bin mit:

env LD_LIBRARY_PATH=`pwd` \ 
env LD_PRELOAD=/usr/lib/libQtGui.so.4 \ 
sbcl --script aalt.lisp 

Dank.

Antwort

2

Ich würde vorschlagen, Sie wie folgt vor:

  1. Da Sie Bibliothek C schreiben ++ und ihre Symbole aus Lisp verwenden, stellen Sie sicher, dass Sie extern "C" Erklärungen verwenden - diese werden benötigt, dass C++ Compiler, um sicherzustellen, nicht Mangelnamen.

  2. Überprüfen Sie, ob Ihre Bibliothek in einer C-Anwendung (nicht in C++) funktioniert. Dadurch wird sichergestellt, dass die Bibliothek selbst funktioniert (z. B. werden keine C++ - Ausnahmen ausgelöst).

UPD:

Ich habe versucht, den Code und hatte den gleichen Absturz zu laufen. Das Problem scheint in Ihrer create_application Funktion zu sein. Ich habe meine feste Version dieser Funktion an http://paste.lisp.org/display/138049 angeschlossen.

Konkret gibt es zwei Probleme:

  1. create_applicationv auf Stapel zugeordnet. Nachfolgender Code (d. H. Die let Bindung) überschreibt ihn.

  2. argv sollte NULL -terminiert sein. Das heißt, es sollte argc+1 Elemente enthalten - das letzte Element ist NULL. (Qt scheint das nicht zu benutzen, aber es ist eine gute Angewohnheit, Code nach Spezifikationen zu schreiben).

In Ihrem Fall der Stapel Allokation ist das Problem - es scheint, dass let Bindung den Wert von v auf Stapel überschreibt, stürzt SBCL.Das Verwenden von malloc oder new, um argv auf Heap zuzuweisen, behebt dieses Problem.

+1

Danke für Ihre Antwort! Ich benutze bereits extern "C", Sie können meinen Code hier sehen: http://pastebin.archlinux.fr/464826 Nun, es funktioniert in Lisp, wenn ich defparameter benutze und nicht lassen, also denke ich, es ist keine C++ Ausnahme ... aber ich werde es trotzdem versuchen und ich werde es euch wissen lassen. – Filippo

+0

danke, es funktioniert! Aber nur mit Clisp, habe ich immer noch den gleichen Fehler mit SBCL. Irgendeine Ahnung ? – Filippo