1

インプレース追加操作の実装を書いています。しかし、何らかの理由で、結果として読み取り専用バッファーを取得することがあります(カスタム拡張クラスと整数を追加している間...)。

関連するコードは次のとおりです。

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...)

4

1 に答える 1

2

ドキュメントによると、オブジェクトのインプレース追加操作は新しい参照を返します。

self呼び出さずに直接戻ることによりPy_INCREF、オブジェクトは参照されている間に解放されます。他のオブジェクトに同じメモリが割り当てられている場合、それらの参照によって新しいオブジェクトが提供されます。

于 2012-08-10T08:39:52.083 に答える