問題タブ [cffi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
common-lisp - CFFI でメタオブジェクトの出力を mem-aref する方法
上記の 2 つの関数定義のラッパーであるこの関数スカラーがあります。じぶんの ?の出力を mem-aref する方法です(scalar 1 2 3 4)
。これはメタオブジェクトと呼ばれると#<CV-SCALAR {10044559D3}>
思います#<CV-SCALAR {10044559D3}>
common-lisp - パラメータとして別の外部型を受け入れる関数で使用できるように CFFI 外部型を定義するにはどうすればよいですか
CでラップされたOpenCV関数(C ++)(CおよびC++関数定義が含まれています)用の3つのdefcfunがあり、上部の2%brisk
つは下部のパラメーターsurf0
として使用できます。上の 2 つの出力とパラメーターが単なる : pointerの場合、ただし、ファイナライザーを使用できるように、ページの下部にあるものと同様に 3 つのタイプをすべて定義する必要があります。3 つのファイナライザーと型はすべて同じです。ページの下部にある 4 つの関数で inとforを置き換えるだけで、それぞれがどのように見えるかがわかります。の出力と入力の型の型を呼び出すだけでよいでしょうか(self feature-detector)
%feat-detect-detect
self
feat-detect-detect
brisk
surf
feature-detector
brisk
surf
feat-detect-detect
同じ名前で、ページの下部にある同じ 4 つの関数型/ファイナライザーの組み合わせをすべて使用するようにするか、より良い方法があります。
c - CFFI を使用した Common Lisp からスタック上の C 関数への構造体の受け渡し
これはCommon Lisp, CFFI, and instantiating c structsという質問のフォローアップのようなものなので、基本的にこの質問は CFFI を使用した Common Lisp からスタック上の c 関数との間で c 構造体を渡したり返したりすることに関するものです。
上記 (2010 年以降) にリンクされている質問に対する答えは、これは不可能であるというものでした。
CFFI の現在のバージョンは、この質問で説明されているように、libffi を介してスタックで構造体を渡したり返したりすることをサポートしています。ただし、libffi は別の依存関係を導入し、libffi は、私が対象としているすべてのシステムでコンパイルするのは簡単ではありません。したがって、呼び出す関数がほとんどないため、libffi を使用しないようにしています。
リンクした最初の質問で説明したように、構造体を分解することにより、スタック上の構造体パラメーターを期待する C 関数を呼び出すことができます。例として、構造体と関数の定義を次に示します。
を使用して Common Lisp からこの関数を呼び出すことができます。
ここで、2 つの質問があります。
これはすべてのプラットフォームで確実に動作しますか? Cでは、定義により、この状況の構造体は個々のパラメーターとまったく同じようにレイアウトされるため、これが機能することが保証されていると思いますが、よくわかりません。
構造体を返すのはどうですか?C関数を想定
libffi を使用せずに、Common Lisp から何らかの方法でこれを呼び出す可能性はありますか?たとえば、CFFI に戻り構造が必要とするメモリ量を伝え、それを手動で「解析」することはできますか?
io - Cのprintfによって出力されるテキストはどこですか
cffi を介して SBCL から C の printf 関数を呼び出す際に問題が発生しました。問題は、printf関数を呼び出すと、出力テキストが見つからず、REPLにprintf関数の戻り値が表示されるだけです。しかし、SBCL を終了すると、魔法のように出力テキストが端末に表示されます。
最後の行 "hello$" は、SBCL を終了すると、テキスト "hello" が端末に表示され、その後にシェル プロンプト "$" が表示されることを意味します。では、printf はテキスト "hello" をどこに出力するのでしょうか?
*standard-output* で `finish-output'、`force-output' を試しましたが、うまくいきません。
encoding - Lisp文字列をC文字列との間で変換する場合、「utf-16」のエンコーディングは一貫していません
cffi を使用して Lisp 文字列を C 文字列に変換するエンコーディングとして「utf-16」を使用すると、実際に使用されるエンコーディングは「utf-16le」であることがわかりました。しかし、C 文字列を Lisp 文字列に戻す場合、実際に使用されるエンコーディングは 'utf-16be' です。私はまだ「babel」(「cffi」のエンコーディング機能を提供する) に慣れていないので、それがバグかどうかはわかりません。
`convtest' は Lisp 文字列を C 文字列に変換し、それから Lisp 文字列に戻します。出力されるガベージ文字列はすべて同じです。テストから、「utf-16」を「to-c」および「from-c」として同時に使用すると、変換が失敗することがわかります。
winapi - CFFI および win32 クリップボードへのアクセス
私は Common Lisp の初心者で、いくつかの実験を行いました。Windows クリップボードにアクセスしようと懸命に努力していたところ、次のリファレンスが見つかりました。
https://groups.google.com/forum/#!topic/comp.lang.lisp/hyNqn2QhUY0
CLISP FFI 用に調整されていることを除けば、それは完璧でした。CFFI で動作するようにしたかったのです。次に、コードを変換しようとしましたが、部分的に成功しましたが、ルーチン (get-clip-string) に問題があり、WinXP 上の Clozure CL 1.10 でテストしました (!):
テストテキスト: 宇宙服を持っている-意志旅行
? (get-clip-string)
エラー: 値 "Have Space Suit-Will Travel" は予期されたタイプ (UNSIGNED-BYTE 32) ではありません。実行中: GLOBAL-LOCK-STRING、プロセス listener(1) 内。:POP を入力して中止し、:R を入力して利用可能な再起動のリストを表示します。タイプ :?他のオプションについて。
私は CFFI の型を理解できなかったと思います (マニュアルを読んだことはありますが)、CLISP の元の処方箋も得られませんでした。誰かヒントはありますか?次の一連のコマンドは機能しますが、安全ではありません。
(open-clip 0) (get-clip 1) (close-clip 0)
コードは次のとおりです。