Pavel3333 1,148 Posted May 2, 2018 (edited) 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 May 2, 2018 by Pavel3333 Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #429058 Posted May 2, 2018 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))) ты в условии не сравниваешь ни с чем это, хотя стоило бы... Quote Share this post Link to post Short link Share on other sites
Pavel3333 1,148 #429059 Posted May 2, 2018 1 минуту назад, SkepticalFox сказал: ты в условии не сравниваешь ни с чем это, хотя стоило бы... смотрю, что значение которое вернуло функция положительно. я это отдебажу, спасибо. 2 минуты назад, SkepticalFox сказал: почему не (fff) поправил, спс. хотя по факту float изначально инициализирована как double Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #429060 Posted May 2, 2018 1 minute ago, Pavel3333 said: смотрю, что значение которое вернуло функция положительно. я это отдебажу, спасибо. но отрицательное тоже тру для ифа Quote Share this post Link to post Short link Share on other sites
Pavel3333 1,148 #429062 Posted May 2, 2018 @SkepticalFox в смысле? оно было бы тру, если было бы беззнаковым, но функция возвращает int Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #429064 Posted May 2, 2018 4 minutes ago, Pavel3333 said: оно было бы тру, если было бы беззнаковым, но функция возвращает int https://stackoverflow.com/questions/18840422/do-negative-numbers-return-false-in-c-c/ Quote Share this post Link to post Short link Share on other sites
Pavel3333 1,148 #429065 Posted May 2, 2018 (edited) @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 May 2, 2018 by Pavel3333 Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #431300 Posted May 21, 2018 On 02.05.2018 at 5:36 PM, Pavel3333 said: PyExc_AttributeError Причем тут AttributeError, если речь идет о некорректном типе данных или количестве аргументов? Вообще, все типы ошибок, и что они означают, можно глянуть здесь. В твоем случае правильный тип исключения TypeError. Quote Share this post Link to post Short link Share on other sites