我有一个python代码,它使用ctypes做一些繁重的工作。它还使用多处理。在意识到我在某些代码中犯了一个工程(而不是编程)错误之后,我更新了c子函数,现在我得到了一个
WindowsError: exception: access violation reading 0x09AA1000
仅在新c代码和启用多处理时发生。最后的地址每次都不同,代码将在抛出错误之前成功运行不同的时间长度。这是旧的(工作)c代码:
void rfnies(double *array_ext, int tot_num, double *array_out) {
double *pr, *po, a[16384], ampl, mean;
int index, j, cNr;
pr = array_ext;
po = array_out;
j = -1;
cNr = 1;
for (index=0; index<tot_num; index++) {
a[++j]=*pr++;
while ( (j >= 2) && (fabs(a[j-1]-a[j-2]) <= fabs(a[j]-a[j-1])) ) {
ampl=fabs( (a[j-1]-a[j-2])/2 );
switch(j)
{
case 0: { break; }
case 1: { break; }
case 2: {
mean=(a[0]+a[1])/2;
a[0]=a[1];
a[1]=a[2];
j=1;
if (ampl > 0) {
*po++=ampl;
*po++=mean;
*po++=0.50;
}
break;
}
default: {
mean=(a[j-1]+a[j-2])/2;
a[j-2]=a[j];
j=j-2;
if (ampl > 0) {
*po++=ampl;
*po++=mean;
*po++=1.00;
cNr++;
}
break;
}
}
}
}
for (index=0; index<j; index++) {
ampl=fabs(a[index]-a[index+1])/2;
mean=(a[index]+a[index+1])/2;
if (ampl > 0){
*po++=ampl;
*po++=mean;
*po++=0.50;
}
}
return;
}
这是导致访问冲突的新代码。我无法看清问题是什么,这让我疯了!
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];
}
}
}
它将运行不同时间长度的事实表明内存中存在某些内容,而其他一个进程正在尝试读取相同的内存。我无法发布一个有效的示例,因为我甚至无法在一些运行中在完整代码中重现它!
任何帮助将不胜感激。