の引数に私は、SWIGで遊ぶために始めました。私は "void *型" を期待し、私はCの関数にPythonの文字列を渡しているコードのこの部分を持っているSWIG:私はPythonでCライブラリを使用できるように、パスのPython文字列型がvoidポインタ
example.h:
char test(void *buf);
はexample.c:
char test(void *buf) {
char *c = (char*)buf;
return *c;
}
Pythonの:
import example
buf = "hello"
example.test(buf)
私はそれを実行すると、私は次のエラーを取得する:
TypeError: in method 'test', argument 1 of type 'void *'
私は「のchar *」を「無効*」パラメータを変更した場合しかし、動作しているようです。私は "void *"がどんな種類のポインタにもマッチすると思ったので少し混乱しています。とにかく、私は周りを掘り出し、ctypesライブラリを見つけて、c_void_p(Python: converting strings for use with ctypes.c_void_p())にキャストしました。それは私にとってはうまくいきませんでした。私の周りの仕事として
は私のSWIGファイルでラッパーを作っ:
/* File: example.i */
%module example
%include typemaps.i
%{
#include "example.h"
%}
%include "example.h"
%inline %{
char test_wrapper(char *buf) {
void *voidBuf = (void*)buf;
return test(voidBuf);
}
%}
これは動作するようです。しかし、私はctypesのアプローチがうまくいかなかった理由について、誰かが説明を提供できるかどうか疑問に思っていました。私がctypesのアプローチで完全にマークから外れていた場合は、インラインラッパーを作成するよりも適切な方法がありますか?
ありがとうございました!