1

私はまだこの種の拡張に慣れていません(C ++とPythonのバックグラウンドは良好ですが)

私が望んでいたのは、ctypesモジュールを使用して、これまで機能していたC++関数の例にデータを渡すことです。

test.dllファイル

#define DLLEXPORT extern "C" __declspec(dllexport)

DLLEXPORT int sum(int a, int b) {
    return a + b;
}

sum_test.pyファイル:

from ctypes import cdll
mydll = cdll.LoadLibrary('test.dll')
mydll.sum(5, 3)

結果は8で、うまく機能します...

注:これを使用してブレンダー用のアドオン(プラグイン)を開発しています。C++関数に渡すデータは巨大な配列(タプルまたは任意のタイプの配列)であり、このデータはGPUに渡されて処理されますOpenCLを使用

主にC++のワークフローは、ポインターを渡すことです(これにより、配列データ全体がGPUにコピーされます)

したがって、質問は次のとおりです。C++内でそのタプルポインタを取得するための最良の方法(最速でもあります)(うまくいけば、PythonとC ++で何が起こるかを説明することで)

4

1 に答える 1

3

最も簡単な方法は、関数が特定の型の配列へのポインターを受け取ることをctypesに伝えることです。多くの場合、Python/ctypesが残りを把握します。

libc = CDLL('libc.so.6') # on Debian/Linux
printf = libc.printf
printf.restype = c_int
printf.argtypes = [POINTER(c_char), c_int]
printf('< %08x >', 1234)

これは、関数が単にポインターを受け取ることを前提としています。たとえば、関数が正確に5つのfloatを使用する場合、c_float * 5パラメーターの種類に応じて指定できます。

于 2013-02-20T20:08:35.293 に答える