Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中ctypes和多处理的内存问题_Python_C_Numpy_Multiprocessing_Ctypes - Fatal编程技术网

Python中ctypes和多处理的内存问题

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,

我有一个python代码,它使用ctypes来完成一些繁重的工作。它还使用多处理。在意识到我在一些代码中犯了一个工程(而不是编程)错误后,我更新了c子函数,现在我得到了一个

    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];
        }

    }

}