3

この「問題」の解決策を探して、約 3 時間、Google で検索しました。CFFIを使用してLispでC構造をインスタンス化する方法を理解しようとしています。私はcに構造体を持っています:

struct cpVect{cpFloat x,y;}

シンプルですよね?この構造体への自動生成されたCFFIバインディング(swigだと思います)があります:

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

これにより、スロット :X および :Y を持つ構造体 "VECT" が生成されます。これは、foreign-slot-names によって確認されます (バインディングを生成したり、C ライブラリ (シマリスの物理学) をプログラムしたりしていないことに注意してください) が、実際の関数は Lisp から呼び出されています)。大丈夫です)。

私は広範囲に検索しましたが、おそらく 100 回は見たことがありますが、他の関数で使用するために Lisp で cpVect のインスタンスを作成する方法がわかりません。

関数に注意してください。

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

cpVect だけでなく、一連の cpVect へのポインターも受け取るため、2 番目の質問が発生します。構造体のセットへのポインターを作成するにはどうすればよいですか?

http://common-lisp.net/project/cffi/manual/html_node/defcstruct.htmlに行ってコードを試してみましたが、「エラー: バインドされていない変数: PTR」が表示されます (私は Clozure CL を使用しています)。言うまでもなく、インスタンスではなくポインターのみを返すように見えます。

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

4

2 に答える 2

2

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

于 2010-12-31T13:16:09.333 に答える
1

これがあまり役立つかどうかはわかりませんが、シマリスの Ruby FFI バインディングを見ることができます: https://github.com/shawn42/chipmunk-ffi/blob/master/lib/chipmunk-ffi/vec2.rb

Chipmunk には、FFI がそれらを使用できるように、すべてのインライン メソッド呼び出しを含むデータ セクションがあります。それらの 1 つは cpv と呼ばれます。cpv は、cpVect 構造体を作成するメソッドです。これについて、私 (shawn42) と github で気軽に会話を始めてください。

于 2011-01-01T02:18:53.197 に答える