4

このような関数がたくさんあるヘッダーファイルをラップしようとしています

test.h

void test(int N, int* data_in, int* data_out);

numpy のものを使用できるようにします。

現在、次の cython コードがあります。

test.pyx

import numpy as np
cimport numpy as np

ctypedef np.int_t itype_t

cdef extern from 'VolumeForm.h':
    void _test 'test' (int, int*, int*)

def wrap_test(np.ndarray[itype_t, ndim=2] data):
    cdef np.ndarray[dtype_t, ndim=1] out
    out = np.zeros((data.shape[0],1), dtype=np.double)
    _test(
        data.shape[0],
        <itype_t*> data.data,
        <itype_t*> out.data
    )
    return out

ただし、コンパイルしようとすると、エラーが発生します。

Error converting Pyrex file to C:
(...)
Cannot assign type 'test.itype_t *' to 'int *'

どうすればこれを修正できますか?

4

2 に答える 2

4

この問題は現在、Cython メーリング リストで議論されています。どうやら、Cython ライブラリの 1 つの小さなバグに起因するようです。

http://codespeak.net/mailman/listinfo/cython-dev

今のところ、考えられる回避策の 1 つは、dtype np.long の NumPy 配列を使用し、代わりに 'ctypedef np.long_t itype_t' を記述することです。次に、int の代わりに long int を使用して C コードを満足させる必要があります。

于 2009-12-27T21:51:44.263 に答える
2

ints からsに変更する必要のない別の回避策long: ブロック内の関数シグネチャを変更しcdef extern from '...'ます。Cython はcdef externブロック内の宣言を使用して、ファイルの生成中に型をチェックし.cますが、生成された C コードは#include "VolumeForm.h".

import numpy as np
cimport numpy as np

ctypedef np.int_t itype_t

cdef extern from 'VolumeForm.h':
    # NOTE: We changed the int* declarations to itype_t*
    void _test 'test' (int, itype_t*, itype_t*)

def wrap_test(np.ndarray[itype_t, ndim=2] data):
    cdef np.ndarray[dtype_t, ndim=1] out
    out = np.zeros((data.shape[0],1), dtype=np.double)
    _test(
        data.shape[0],
        <itype_t*> data.data,
        <itype_t*> out.data
    )
    return out

Cython は上記について文句を言いません。

于 2011-02-19T20:01:51.680 に答える