Ваш std::vector
объект кажется локальным для этой функции. PyArray_SimpleNewFromData
не делает копию данных, которые вы передаете. Он просто держит указатель. Поэтому, как только ваша функция py_integrate возвращается, вектор освобождается. Печать работает в первый раз, потому что еще ничего не записано в освобожденную память, но к тому времени, когда вы переходите к следующему отпечатку, что-то еще использует эту память, что приводит к разным значениям.
Вам необходимо создать массив NumPy, которому принадлежит собственное пространство хранения, а затем скопировать в него данные.
Или же разместите свой вектор в куче. Затем сохраните указатель на него в CObject . Предоставьте деструктор, который удаляет вектор. Затем взгляните на тип C-level PyArrayObject . У него есть PyObject *
член с именем base
. Храните свой CObject
там. Затем, когда массив NumPy будет собирать мусор, счетчик ссылок на этот базовый объект будет уменьшен, и, если вы не взяли его копию в другом месте, ваш вектор будет удален благодаря предоставленному вами деструктору.
Fixer Верхняя
Вы забыли фактически создать PyArray. Попробуйте это:
(Вы не опубликовали DeleteVector
, поэтому я могу только надеяться, что это правильно)
std::vector<double> *vector = new std::vector<double>();
vector->push_back(1.);
PyObject *py_integral = PyCObject_FromVoidPtr(vector, DeleteVector);
npy_intp size = {vector->size()};
PyObject *out = PyArray_SimpleNewFromData(1, &size, NPY_DOUBLE, &((*vector)[0]));
((PyArrayObject*) out)->base = py_integral;
return out;
Примечание: я не программист на C ++, поэтому могу только предположить, что &((*vector)[0])
работает так, как задумано, с указателем на вектор. Я знаю, что вектор перераспределяет свою область памяти, если вы ее увеличиваете, поэтому не увеличивайте его размер после получения этого указателя, иначе он больше не будет действительным.