在c代码中调用python函数时第三次出现访问冲突写入位置错误

在c代码中调用python函数时第三次出现访问冲突写入位置错误,python,c++,Python,C++,我正在用c编写代码来解决一个问题。在c代码中,我需要调用一个自定义python来求解一个方程。我可以两次调用python函数,但是当我第三次调用时,我得到一个错误:“Project.1.exe中0x00007FEDF8A4E0C(multiarray.cp35-win_amd64.pyd)处未处理的异常:0xC000005:访问冲突写入位置0x000000000000000A。”这非常奇怪,因为在第一次和第二次,我可以成功调用该函数,如果我使用第三次使用的参数独立调用该函数,该函数可以运行得很好

我正在用c编写代码来解决一个问题。在c代码中,我需要调用一个自定义python来求解一个方程。我可以两次调用python函数,但是当我第三次调用时,我得到一个错误:“Project.1.exe中0x00007FEDF8A4E0C(multiarray.cp35-win_amd64.pyd)处未处理的异常:0xC000005:访问冲突写入位置0x000000000000000A。”这非常奇怪,因为在第一次和第二次,我可以成功调用该函数,如果我使用第三次使用的参数独立调用该函数,该函数可以运行得很好。但是,如果我尝试连续执行该工作,则会导致上述异常。我在STACKOVERFLOW中看到了一个类似的问题“C的Python API:调用Python函数2X会导致访问冲突写入位置”,但是,这个问题没有答案

PyObject* pRet = PyEval_CallObject(pv, args);
上面的c代码是第三次调用python函数时导致异常的地方。下面将更清楚地描述调用python函数的整个过程

首先是python函数

from sympy import *
init_printing(use_unicode=True)
def evaluate_dH(eps,bmax,H,B_H1,B_H2):
    x=symbols("x")
    expr=eps*(x-bmax)**2*x**(H+2)-(H+2)*x*B_H1+(H+1)*B_H2
    result=solve(expr,x)#result is a list type
在求解方程时,我使用了“>bmax”和“nota complex”两个条件来找到我需要的“result”中的值。决赛只有一场。因此,

return result[0]
其次,这里是c代码中的调用过程。 首先,“double find_dH”是我在主函数中使用的一个c函数

double find_dH
(....)
{
double B_H2 = findBH(region, vecp_vertex, H + 2, index);
double B_H1 = findBH(region, vecp_vertex, H + 1, index);
double eps = 0.01;
double bmax = findbmax(region, vecp_vertex);
Py_Initialize();
PyObject *pModule = NULL;
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
pModule = PyImport_ImportModule("evaluate_dH");
PyObject* pv = PyObject_GetAttrString(pModule, "evaluate_dH");
PyObject* args = PyTuple_New(5);
PyTuple_SetItem(args, 0, Py_BuildValue("d", double(eps)));
PyTuple_SetItem(args, 1, Py_BuildValue("d", double(bmax)));
PyTuple_SetItem(args, 2, Py_BuildValue("i", H));
PyTuple_SetItem(args, 3, Py_BuildValue("d", double(B_H1)));
PyTuple_SetItem(args, 4, Py_BuildValue("d", double(B_H2)));
PyObject* pRet = PyEval_CallObject(pv, args);
double result = PyFloat_AsDouble(pRet);
Py_Finalize();
return result;
}
这里是导致异常的位置:“Project.1.exe中0x00007FEDF8A4E0C(multiarray.cp35-win_amd64.pyd)处未处理的异常:0xC000005:访问冲突写入位置0x000000000000000A。”。但是,“PyEval_CallObject(pv,args)”在第三次使用之前就可以正常工作

PyObject* pRet = PyEval_CallObject(pv, args);
我猜例外情况是由以下原因造成的: 1.多次导入模块“sympy” 2.每次调用后,调用过程中的那些“PyObject”都没有空闲时间


谢谢你的阅读和回答

你能创建一个单一的?大量的小片段使我们无法分辨所有的元素是如何组合在一起的。这与实际问题无关,但您真的想删除最大值以下的元素吗
elif abs(i)-bmax:
此外,and部分完全过时:abs为正,因此如果bmax为正,则第二次检查始终成功-如果bmax为负,则第一次检查已失败-始终…涉及一些空指针(
x=nullptr;x->member=…
成员的偏移量为10,以获取地址0xa…)。您是否检查了每个元组成员是否不是
nullptr
?您是否尝试调试到了?@MilesBudnek谢谢。我只是担心如果人们能清楚地理解这个问题,我会尽量让它更清晰brief@Aconcagua谢谢。删除低于最大值的元素是一个错误,我已经修复了。但这不是主要问题。请参阅指向您提到的“空指针”和“每个元组成员”,指针和元组的具体含义是什么?通过“evaluate_dH”获得的结果实际上是一个列表,您的意思是我需要检查它吗?