Хочу связать си\с++ код с кодом python. Для этого сделал решение в котором 2 проекта: 1 на плюсах, 1 на питоне. В плюсах есть 2 ф-ции (mySumm(), func_math()):
typedef struct
{
double x, y, z;
} point3;
point3 L = { 1.21, 2.321, 3.321123 };
point3 func_math(
double P,
double R,
double Q,
uint16_t last_ray,
double f[4],
point3 L)
{
point3 W;
W.x = P + R + Q;
W.y = L.x + L.y + L.z;
W.z = (f[0] + f[1] + f[2] + f[3]) * last_ray;
return W;
}
int mySumm(long a, long b)
{
return a + b;
}
И код который [преобразует проекта C++ в расширение для Python][1]:
/* func_math */
PyObject* func_math_py(PyObject *, PyObject* o) {
double P, R, Q;
unsigned long n_ray;
double Fd[4];
Q = PyFloat_AsDouble(PyList_GetItem(o, 0));
P = PyFloat_AsDouble(PyList_GetItem(o, 1));
R = PyFloat_AsDouble(PyList_GetItem(o, 2));
n_ray = PyLong_AsUnsignedLong(PyList_GetItem(o, 3));
Fd[0] = PyFloat_AsDouble(PyList_GetItem(o, 4));
Fd[1] = PyFloat_AsDouble(PyList_GetItem(o, 5));
Fd[2] = PyFloat_AsDouble(PyList_GetItem(o, 6));
Fd[3] = PyFloat_AsDouble(PyList_GetItem(o, 7));
point3 W = func_math(P, R, Q, n_ray, Fd, L);
PyObject *t;
t = PyTuple_New(4);
PyTuple_SetItem(t, 0, PyFloat_FromDouble(W.x));
PyTuple_SetItem(t, 1, PyFloat_FromDouble(W.z));
PyTuple_SetItem(t, 2, PyFloat_FromDouble(W.y));
return t;
}
PyObject* mySumm_py(PyObject *, PyObject* o) {
return PyLong_FromLong(mySumm(PyLong_AsLong(PyList_GetItem(o, 0)),
PyLong_AsLong(PyList_GetItem(o, 1))));
}
static PyMethodDef mysummmodule_methods[] = {
// The first property is the name exposed to python, the second is the C++ function name
{ "mySumm", (PyCFunction)mySumm_py, METH_O, nullptr },
{ "func_math", (PyCFunction)func_math_py, METH_O, nullptr },
// Terminate the array with an object containing nulls.
{ nullptr, nullptr, 0, nullptr }
};
static PyModuleDef mysummmodule_module = {
PyModuleDef_HEAD_INIT,
"mysummmodule", // Module name
"Test func. mySumm(long a, long b)", // Module description
0,
mysummmodule_methods // Structure that defines the methods
};
PyMODINIT_FUNC PyInit_mysummmodule() {
return PyModule_Create(&mysummmodule_module);
}
В проекте на питоне написан следующий код:
import mysummmodule as m
print('m.mySumm([2,3]) = {}'.format(m.mySumm([2,3])))
print(help(m))
print('m.func_math([1.1, 2.2, 3.3, 4, 5.5, -6.6, -7.7]) = {}'.format(
m.func_math([1.1, 2.2, 3.3, 4, 5.5, -6.6, -7.7])))
Консоль выводит это:
m.mySumm([2,3]) = 5
Help on module mysummmodule:
NAME
mysummmodule - Test func. mySumm(long a, long b)
FUNCTIONS
func_math(...)
mySumm(...)
FILE
c:\users\q\documents\visual studio 2017\projects\testpy_cpp\x64\release\mysummmodule.pyd
None
TypeError: bad argument type for built-in operation
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\q\documents\visual studio 2017\Projects\testPy_CPP\Py\Py.py", line 5, in <module>
print('m.func_math([1.1, 2.2, 3.3, 4, 5.5, -6.6, -7.7]) = {}'.format(m.func_math([1.1, 2.2, 3.3, 4, 5.5, -6.6, -7.7])))
SystemError: <built-in function func_math> returned a result with an error set
То есть: ф-ция mySumm -- работает корректно.
Ф-ция func_math -- выдает ошибку.
Не знаю, откуда берется ошибка, и как ее исправить. Работаю в VS2017 Prewiew. Проект выложен на гит тут.
Сделали кортеж на 4 елемента, а заполнили 3:
t = PyTuple_New(4);
PyTuple_SetItem(t, 0, PyFloat_FromDouble(W.x));
PyTuple_SetItem(t, 1, PyFloat_FromDouble(W.z));
PyTuple_SetItem(t, 2, PyFloat_FromDouble(W.y));
P.S: Также добавьте через строку эту строку:
std::cout << "__LINE__:" << __LINE__ << " PyErr:" << PyErr_Print() << std::endl;
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть ли способ отследить событие звонка Skype из своего приложения?
Здравствуйте люди добрые! Решаю задачку по плюсам, суть такая, что не могу написать специализацию шаблона функции - компилятор ругаетсяСуть...
ЗдравствуйтеНеобходимо загрузить и отрисовать карту в tmx-формате