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