インプレース追加操作の実装を書いています。しかし、何らかの理由で、結果として読み取り専用バッファーを取得することがあります(カスタム拡張クラスと整数を追加している間...)。
関連するコードは次のとおりです。
static PyObject *
ModPoly_InPlaceAdd(PyObject *self, PyObject *other)
{
if (!ModPoly_Check(self)) {
//Since it's in-place addition the control flow should never
// enter here(I suppose)
if (!ModPoly_Check(other)) {
PyErr_SetString(PyExc_TypeError, "Neither argument is a ModPolynomial.");
return NULL;
}
return ModPoly_InPlaceAdd(other, self);
} else {
if (!PyInt_Check(other) && !PyLong_Check(other)) {
Py_INCREF(Py_NotImplemented);
return Py_NotImplemented;
}
}
ModPoly *Tself = (ModPoly *)self;
PyObject *tmp, *tmp2;
tmp = PyNumber_Add(Tself->ob_item[0], other);
tmp2 = PyNumber_Remainder(tmp, Tself->n_modulus);
Py_DECREF(tmp);
tmp = Tself->ob_item[0];
Tself->ob_item[0] = tmp2;
Py_DECREF(tmp);
return (PyObject *)Tself;
}
戻る(PyObject*)Tself
(または単に「自己」)のではなく、例外を発生させた場合、元のオブジェクトは正しく更新されます[いくつかを使用してチェックされますprintf
]。マクロを使用すると、(Python側で)Py_RETURN_NONE
に正しくModPoly
変換されます。None
私は何が間違っているのですか?オブジェクトへのポインタを返していますが、ModPoly
これはどのようにしてバッファになりますか?そして、私はそれらのポインターに対する操作を見ていません。
使用例:
>>> from algebra import polynomials
>>> pol = polynomials.ModPolynomial(3,17)
>>> pol += 5
>>> pol
<read-only buffer ptr 0xf31420, size 4 at 0xe6faf0>
リターンラインを次のように変更してみました。
printf("%d\n", (int)ModPoly_Check(self));
return self;
インプレースで追加すると出力1
されます(つまり、返される値のタイプはModPolynomial
...)