2010-12-31 14 views
3

私は約3時間、この "問題"の解決策を探していました。私はCFFIを使ってLispでC構造体をインスタンス化する方法を理解しようとしています。私はCで構造体を持っています:一般的なlisp、CFFI、インスタンス化のC構造体

struct cpVect{cpFloat x,y;} 

シンプルな権利ですか?これは、スロットを備えた構造体「VECT」を生成

(cffi:defcstruct #.(chipmunk-lispify "cpVect" 'classname) 
    (#.(chipmunk-lispify "x" 'slotname) :double) 
    (#.(chipmunk-lispify "y" 'slotname) :double)) 

:Xと:Y、外国スロット名の確認は、(ことに注意してください私は、自動生成されたCFFIのこの構造体へのバインディングを(SWIGが、私は思う)持っています私はバインディングを生成したり、Cライブラリ(chipmunk physics)をプログラムしていませんが、実際の関数はちょうど良いlispから呼び出されています。

私はそれを100回見て、それを見てきたかもしれませんが、他の機能で使用するためにlispでcpVectのインスタンスを作成する方法を理解できません。

注機能:

cpShape *cpPolyShapeNew(cpBody *body, int numVerts, cpVect *verts, cpVect offset) 

だけでなくcpVectがかかりますが、また私の2番目の質問に私をもたらしますcpVectsのセットへのポインタ:どのように私は、構造体のセットへのポインタを作成します?

http://common-lisp.net/project/cffi/manual/html_node/defcstruct.htmlに行ってコードを試しましたが、「エラー:バインドされていない変数:PTR」(私はClozure CLにあります)を取得しました。

私は、これまでかなり強くなっていますが、これは私が理解できない最初の本当の問題です。ありがとう!

+1

FOREIGN-ALLOCで割り当てますか? –

+0

ポインタを収集するための作業...問題の半分。ありがとうございました!! – andrew

答えて

2

最も一般的なLispの実装では、構造体をスタックに渡すことができません。 libffiを使用してその機能を追加するfsbv libraryがあります。構造のレイアウトを知っていれば、一連の基本的な引数として手動で分解することができますが、それは明らかに脆弱です。

+0

私は結局スタックに割り当てる必要はありませんでしたが、あなたの答えはもっと深く掘り下げました。ありがとうございました。 – andrew

1

わからない、これは非常に役立ちますが、あなたがシマリスのためにルビーFFIバインディングで見ることができる: https://github.com/shawn42/chipmunk-ffi/blob/master/lib/chipmunk-ffi/vec2.rb

シマリスはそうFFIは、それらを使用することができます呼び出し、すべてのインラインメソッドを持っているデータセクションがあります。それらの1つはcpvと呼ばれています。 cpvは、cpVect構造体を作成するメソッドです。このことについてgithub w/me(shawn42)で会話を始めるのはどうぞお気軽に。

+0

CFFIバインディングは実際には分割されているので、cpVectが必要なたびにvect-xとvect-yを別々の引数として渡します(スタック上に作成する問題を解決します)。ポインターを割り当てる限り、CFFIはうまく機能しています。 – andrew

関連する問題