Вопрос о реализации Python TP_REPRC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Вопрос о реализации Python TP_REPR

Сообщение Anonymous »

Я создал свой собственный тип в C ++ (называемый «сценарий»). Чтобы иметь возможность отправлять объекты этого типа по сети, я реализовал преобразование его в словарь - используя свой собственный сценарий () функция. My TP_REPR -method использует ту же функцию, чтобы «представлять» данные как словарь:

Код: Выделить всё

static PyObject *
scenarioToDict(PyObject *self)
{
/*
* Put all our fields into a "dictionary" object:
*/
PyObject *result = PyDict_New();

for (const auto *m = scenarioGetSet; m->name != NULL; m++) {
if (m->get == NULL)
continue;
PyDict_SetItemString(result,
m->name, m->get(self, m->closure));
}

for (const auto *m = self->ob_type->tp_members; m->name != NULL; m++) {
void        *p = ((char *)self + m->offset);

switch (m->type) {
case T_DOUBLE:
PyDict_SetItemString(result, m->name,
PyFloat_FromDouble(*(double *)p));
continue;
case T_INT:
PyDict_SetItemString(result, m->name,
PyLong_FromLong(*(int *)p));
continue;
default:
PyErr_Format(PyExc_NotImplementedError,
"%s: field '%s' is of unexpected type %d.",
__func__, m->name, m->type);
result->ob_type->tp_free(result);
return NULL;
}
}

return result;
}

static PyObject *
scenarioRepr(PyObject *self)
{
PyObject *result = scenarioToDict(self);

/*
* Convert the dictionary object with all our fields
* into a string -- using its own "repr"
*/
return result->ob_type->tp_repr(result);
}
Программа работает иногда, а иногда и сбои в pyobject_repr () -четкое указание повреждения памяти: (
У меня есть подозрение, мне нужно увеличить ref-count , но где?

Подробнее здесь: https://stackoverflow.com/questions/797 ... ementation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»