ctypes を使用して構造体ポインタを返す C 関数にアクセスしようとしています。EPD の 32 ビット ipython を使用しています。私は 64 ビットの CentOS マシンを使用していますが、共有ライブラリが 32 ビットであるため、32 ビットの Python を使用する必要があります。構造体ポインターを取得しようとすると、セグメンテーション違反が発生します。別の C 関数への入力として構造体を使用しているだけなので、構造体フィールドにアクセスする必要はありません。コードは次のようになります。
from ctypes import *
libfoo = CDLL("libfoo.so")
func1 = libfoo.func1
func2 = libfoo.func2
func1.restype = c_void_p
obj = func1() # This is where it stops with segfault
func2 (data, obj)
Cコード
typedef struct
{
int int1;
int int2;
float float1;
float *arr;
fftwf_plan fft;
} mystruct;
mystruct *func1(void)
{
mystruct *bar = (mystruct *) malloc (sizeof(mystruct));
bar->int1 = 1;
bar->int2 = 2;
bar->float1 = 1.0;
....
bar->arr = (float *) fftwf_malloc (sizeof(float) * (FFT_LEN + 2));
bar->fft = fftwf_plan_dft_r2c_1d (FFT_LEN, ch->arr, (fftwf_complex *)ch->arr, FFTW_MEASURE);
return bar;
}
void func2 (float *data, mystruct *bar)
{
....
}
ctypes 構造体オブジェクトも作成しようとしましたが、それでも segfault が発生しました。可能であれば、ctypes 構造体を作成せずに、単純に func2 にポインターを渡したいと思います。同様の質問を持ついくつかの投稿を読みましたが、実際に一致するものはありません。