2013-07-10 12 views
6

LispからQtウィンドウをすばやく作成するためのおもちゃC++ライブラリを構築しました。私はcommon-qtが存在することを知っています。私はcffiの使い方を学んでいます。Lisp、cffi、letとメモリ

  • アプリケーションを作成します:ポインタはQApplicationを作成し、返し
  • -ウィンドウを作成します。poinerをQMainWindowを作成し、返し
  • ショー:ショー今

    、私は4つのバインドさ機能を持っています引数として

  • のexecを指定したウィンドウ:ここでのQtのexec機能

はperfec仕事Lispコードであります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) 

私はLETまたはLETを使用しています* ...私は記憶障害があります!

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

なぜ誰かが知っていますか?

私はSBCLを使用しています:

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

感謝を。

答えて

2

私はあなたが以下のかを示唆している:あなたはextern "C"宣言を使用していることを確認し、ライブラリCを書い++とLispからその記号を使用しているので

  1. - これらは、C++コンパイラがないことを保証するために必要とされていますマングルの名前。

  2. ライブラリがC(C++以外の)アプリケーションで動作することを確認します。これにより、ライブラリ自体が動作していることが保証されます(たとえば、C++の例外は発生しません)。

UPD:私はあなたのコードを実行しようとしたと同じクラッシュを持っていた

。問題はあなたのcreate_application機能にあるようです。私はhttp://paste.lisp.org/display/138049にこの関数の固定版を添付しました。スタック上に割り当てられた

  1. create_applicationv

    具体的には、2つの問題があります。後続のコード(つまり、letバインディング)が上書きされます。

  2. argvは、NULLである必要があります。すなわち、それはargc+1要素を含むべきです - 最後の要素はNULLです。 (Qtはこれを使用していないようですが、仕様に従ってコードを書くのは良い習慣です)。あなたのケースでは

は、スタック割り当てが問題である - letが結合SBCLをクラッシュ、スタック上vの値が上書きされているようです。mallocまたはnewを使用してargvをヒープに割り当てると、この問題が修正されます。

+1

あなたの答えをありがとう! 私はすでにあなたがここに私のコードを見ることができる、にextern「C」を使用します。http://pastebin.archlinux.fr/464826 まあ、私は聞かせてdefparameterなく使用している場合、それはLispの中で働いているので、私はそれがだと思いますC++の例外ではありません...とにかく試してみましょう。私はあなたに知らせます。 – Filippo

+0

ありがとう、それは動作します!しかし、Clispだけで、私はまだSBCLと同じエラーがあります。どんな手掛かり ? – Filippo