Jump to content
Korean Random
Pavel3333

[Решено] Помогите с Py_INCREF() и Py_DECREF()

Recommended Posts

PyObject* trj_model(PyObject *self, PyObject *args)
{
    char* path;
    float x, y, z;

    if (!PyArg_ParseTuple(args, "sddd", &path, &x, &y, &z)) {
        PyErr_SetString(PyExc_AttributeError, "Incorrect input");
        Py_RETURN_NONE;
    }

    PySys_WriteStdout("0\n");

    PyObject* Model = PyObject_CallMethod(PyImport_AddModule("BigWorld"), "Model", "(s)", path);

    PySys_WriteStdout("1\n");

    if (Model == nullptr) {

        PySys_WriteStdout("2\n");
        Py_RETURN_NONE;
    }

    if(PyObject_SetAttrString(Model, "position", Py_BuildValue("(ddd)", x, y, z))) Py_RETURN_NONE;

    PySys_WriteStdout("3\n");

    return Model;
};

Крашится клиент при очередном создании модели. То есть раз 25 модель создалась нормально, но на 26-й раз всё крашнулось. Всё это произошло ровным счётом после того, как я добавил строку присваивания позиции модели:  

if(PyObject_SetAttrString(Model, "position", Py_BuildValue("(ddd)", x, y, z))) Py_RETURN_NONE;

Не уверен, но кажется, что где-то нужно сделать Py_INCREF() и Py_DECREF(), только не знаю, где конкретно. По идее после создания модели она уже инкрефнута, а вот что случается после изменения атрибута позиции я не могу понять. 

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Решено, см. пост

Edited by Pavel3333

Share this post


Link to post

Short link
Share on other sites
36 minutes ago, Pavel3333 said:

(ddd)

почему не (fff), если

36 minutes ago, Pavel3333 said:

float x, y, z;

?

и еще

38 minutes ago, Pavel3333 said:

if(PyObject_SetAttrString(Model, "position", Py_BuildValue("(ddd)", x, y, z)))

ты в условии не сравниваешь ни с чем это, хотя стоило бы...

Share this post


Link to post

Short link
Share on other sites
1 минуту назад, SkepticalFox сказал:

ты в условии не сравниваешь ни с чем это, хотя стоило бы...

смотрю, что значение которое вернуло функция положительно. я это отдебажу, спасибо.

2 минуты назад, SkepticalFox сказал:

почему не (fff)

поправил, спс.

хотя по факту float изначально инициализирована как double

Share this post


Link to post

Short link
Share on other sites
1 minute ago, Pavel3333 said:

смотрю, что значение которое вернуло функция положительно. я это отдебажу, спасибо.

но отрицательное тоже тру для ифа

Share this post


Link to post

Short link
Share on other sites

@SkepticalFox обалдеть, не знал, спасибо

Отладил, результат выполнения всегда 0 :O

 

 creating model...
*** 
*** 0
*** 1
*** SetAttrString result: 0model created!
*** creating model...
*** 0
*** 1
*** SetAttrString result: 0model created!
*** creating model...
*** 0
*** 1

 

@SkepticalFox вычитал доку, 

Цитата

Raise an exception and return -1 on failure; return 0 on success

таки ты был прав. нужно проверять, если он не 0, а -1.

Решено!
Такой код работает:

PyObject* trj_model(PyObject *self, PyObject *args)
{
	char* path;
	float x = 0.0;
	float y = 0.0;
	float z = 0.0;

	if (!PyArg_ParseTuple(args, "sfff", &path, &x, &y, &z)) {
		PyErr_SetString(PyExc_AttributeError, "Incorrect input");
		Py_RETURN_NONE;
	}

	PyObject* Model = PyObject_CallMethod(PyImport_AddModule("BigWorld"), "Model", "(s)", path);

	if (Model == nullptr) {

		Py_RETURN_NONE;
	}

	if (PyObject_SetAttrString(Model, "position", Py_BuildValue("(fff)", x, y, z)) == -1) { 
		Py_DECREF(Model);
		Py_RETURN_NONE;
	}

	return Model;
};

 

Edited by Pavel3333

Share this post


Link to post

Short link
Share on other sites
On 02.05.2018 at 5:36 PM, Pavel3333 said:

PyExc_AttributeError

Причем тут AttributeError, если речь идет о некорректном типе данных или количестве аргументов?

Вообще, все типы ошибок, и что они означают, можно глянуть здесь.

В твоем случае правильный тип исключения TypeError.

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...