Python中ctypes和多处理的内存问题
我有一个python代码,它使用ctypes来完成一些繁重的工作。它还使用多处理。在意识到我在一些代码中犯了一个工程(而不是编程)错误后,我更新了c子函数,现在我得到了一个Python中ctypes和多处理的内存问题,python,c,numpy,multiprocessing,ctypes,Python,C,Numpy,Multiprocessing,Ctypes,我有一个python代码,它使用ctypes来完成一些繁重的工作。它还使用多处理。在意识到我在一些代码中犯了一个工程(而不是编程)错误后,我更新了c子函数,现在我得到了一个 WindowsError: exception: access violation reading 0x09AA1000 这仅在新的c代码和启用多处理时发生。最后的地址每次都不同,在抛出错误之前,代码将成功运行不同的时间长度。以下是旧的(工作)c代码: void rfnies(double*array\u ext,
WindowsError: exception: access violation reading 0x09AA1000
这仅在新的c代码和启用多处理时发生。最后的地址每次都不同,在抛出错误之前,代码将成功运行不同的时间长度。以下是旧的(工作)c代码:
void rfnies(double*array\u ext,int tot\u num,double*array\u out){
双*pr,*po,a[16384],ampl,平均值;
国际指数,j,cNr;
pr=数组_ext;
po=数组_out;
j=-1;
cNr=1;
对于(指数=0;指数=2)和&(晶圆厂(a[j-1]-a[j-2])0{
*po++=ampl;
*po++=平均值;
*po++=0.50;
}
打破
}
默认值:{
平均值=(a[j-1]+a[j-2])/2;
a[j-2]=a[j];
j=j-2;
如果(ampl>0){
*po++=ampl;
*po++=平均值;
*po++=1.00;
cNr++;
}
打破
}
}
}
}
对于(索引=0;索引0){
*po++=ampl;
*po++=平均值;
*po++=0.50;
}
}
返回;
}
这是导致访问冲突的新代码。我看不出问题出在哪里,这让我发疯
void rf3(double *array_ext, int tot_num, double *array_out) {
double *pr, *po, E[tot_num], ampl, mean, XX, YY;
int index, j, cNr, nn;
pr = array_ext;
po = array_out;
j=0;
nn = -1;
while (j<=tot_num){
nn++;
E[nn] = *(pr+j);
j++;
while (nn >= 2){
XX = fabs(E[nn] - E[nn - 1]);
YY = fabs(E[nn - 1] - E[nn - 2]);
if (XX<YY){break;}
ampl=YY/2.0;
mean=(E[nn - 1] + E[nn - 2])/2.0;
*po++=ampl;
*po++=mean;
*po++=1.00;
nn = nn - 2;
E[nn] = E[nn + 2];
}
}
}
void rf3(double*array\u ext,int tot\u num,double*array\u out){
双*pr、*po、E[tot_num]、ampl、mean、XX、YY;
国际指数,j,cNr,nn;
pr=数组_ext;
po=数组_out;
j=0;
nn=-1;
while(j=2){
XX=fabs(E[nn]-E[nn-1]);
YY=fabs(E[nn-1]-E[nn-2]);
如果(xxx)在配置为同时调试子进程的调试器中运行脚本。调试器将获得第一次机会异常,因此您可以打印堆栈跟踪并检查局部变量。
void rf3(double *array_ext, int tot_num, double *array_out) {
double *pr, *po, E[tot_num], ampl, mean, XX, YY;
int index, j, cNr, nn;
pr = array_ext;
po = array_out;
j=0;
nn = -1;
while (j<=tot_num){
nn++;
E[nn] = *(pr+j);
j++;
while (nn >= 2){
XX = fabs(E[nn] - E[nn - 1]);
YY = fabs(E[nn - 1] - E[nn - 2]);
if (XX<YY){break;}
ampl=YY/2.0;
mean=(E[nn - 1] + E[nn - 2])/2.0;
*po++=ampl;
*po++=mean;
*po++=1.00;
nn = nn - 2;
E[nn] = E[nn + 2];
}
}
}