현재 위치 추가 작업의 구현을 작성하고 있습니다. 하지만, 어떤 이유로 (때때로 사용자 정의 확장 클래스와 정수를 추가하는 동안) 결과로 읽기 전용 버퍼를 얻습니다.nb_inplace_add를 구현하면 읽기 전용 버퍼 객체가 반환됩니다.
관련 코드는 다음과 같습니다 대신 (단순히 "자신을"또는) (PyObject*)Tself
를 반환하는, 내가 예외를 발생하면 원래 객체가 제대로 업데이 트를 얻을 수
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;
}
[일부 printf
사용하여 확인]. 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;
및 추가 할 때이 자리에서 (반환 값이 유형 ModPolynomial
의 것을 의미 1
를 인쇄 ...)
네가 맞아. 이것은 내 첫 번째 C- 확장이며, 그래서 내가 언제 INCREF/DECREF해야하는지 이해하려고 노력하고있다. – Bakuriu