Numpy C APIを使用してCumpでNumpy配列を作成しようとしていますが、ユーティリティクラスでラップされています。ほとんどのものは期待どおりに動作していますが、PyArray_Descr*
を取る関数の1つを使って配列を作成しようとすると、プログラムは直ちにsegfaultsします。作成のためにPyArray_Descr
を設定する正しい方法は何ですか?Numpy C API - 配列の作成にPyArray_Descrを使用するとsegfaultsが発生する
動作していないコードの例:
PyMODINIT_FUNC
PyInit_pysgm()
{
import_array();
return PyModule_Create(&pysgmmodule);
}
// ....
static PyAry zerosLike(PyAry const& array)
{
PyArray_Descr* descr = new PyArray_Descr;
Py_INCREF(descr); // creation function steals a reference
descr->type = 'H';
descr->type_num = NPY_UINT16;
descr->kind = 'u';
descr->byteorder = '=';
descr->alignment = alignof(std::uint16_t);
descr->elsize = sizeof(std::uint16_t);
std::vector<npy_intp> shape {array.shape().begin(), array.shape().end()};
// code segfaults after this line before entering PyAry constructor
return PyAry(PyArray_Zeros(shape.size(), shape.data(), descr, 0));
}
(uint16のとテスト)。
は、私が唯一の問題かもしれtypeobj
フィールドを設定していないんだけど、私はタイプPyTypeObject
の適切な値がどうなるかうまくいかないことができます。
:This pageには、さまざまな種類のScalarArray PyTypeObjectインスタンスがリストされています。行の追加
descr->typeobj = &PyUShortArrType_Type;
は問題を解決していません。
おっと - 私はこれに戻ってくるつもりでした。あなたは正しい、これは私が見つけた答えです。 – Qualia