1

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 にポインターを渡したいと思います。同様の質問を持ついくつかの投稿を読みましたが、実際に一致するものはありません。

4

0 に答える 0