循环中的C代码未被执行

时间:2013-08-14 11:26:22

标签: c arrays loops

背景:整个程序设计用于在参考图像和1800个目标图像之间执行2D DIC(用于层析成像重建)在我的代码中,有用于循环块的

for (k=0; k<kmax; k++)
{
    K=nm12+(k*(h-n+1))/(kmax-1);
    printf("\nk=%d\nL= ", K);
    for (l=0; l<lmax; l++)
    {
        ///For each subset, calculate and store its mean and standard deviation.   
        ///Also want to know the sum and sum of squares of subset, but in two sections, stored in fm/df[k][l][0 and 1].
        L=nm12+(l*(w-n+1))/(lmax-1);
        printf("%d ", L);
        fm[k][l][0]=0;
        df[k][l][0]=0;
        fm[k][l][1]=0;
        df[k][l][1]=0;
        ///loops are j then i as it is more efficient (saves m-1 recalculations of b=j+L; 
        for (j=0; j<m; j++)
        {
            b=j+L;
            for (i=0; i<M; i++)
            {
                a=i+K;
                fm[k][l][0]+=ref[a][b];
                df[k][l][0]+=ref[a][b]*ref[a][b];
            }

            for (i=M; i<m; i++)
            {
                a=i+K;
                fm[k][l][1]+=ref[a][b];
                df[k][l][1]+=ref[a][b]*ref[a][b];
            }
        }
        fm[k][l][2]=m2r*(fm[k][l][1]+fm[k][l][0]);
        df[k][l][2]=sqrt(df[k][l][1]+df[k][l][0]-m2*fm[k][l][2]*fm[k][l][2]);
        a+=1;
    }
}

每次l达到10时,行df[k][l][2]=sqrt(df[k][l][1]+df[k][l][0]-m2*fm[k][l][2]*fm[k][l][2]);似乎不再被执行。我的意思是调试器显示df [k] [l] [2]的值没有正确地从零变为总和。此外,无论k和l如何,df [k] [l] [0和1]都保持固定,只要l> = 10。

kmax = 15,lmax = 20,n = 121,m = 21,M =(3 * m)/ 4 = 15,nm12 =(n-m + 1)/ 2 = 50.

数组fm和df是双数组,声明为double fm[kmax][lmax][3], df[kmax][lmax][3];

此外,行a+=1;只是用作断点来检查df [k] [l] [2]的值,并且对代码功能没有影响。

对于为什么会发生这种情况,如何修复等方面的任何帮助都将非常感激!

编辑:更多信息。

数组ref(包含参考图像像素值)是一个动态数组,在此代码块中使用malloc分配内存:

    double **dark, **flat, **ref, **target, **target2, ***gm, ***dg;
    dark=(double**)malloc(h * sizeof(double*));
    flat=(double**)malloc(h * sizeof(double*));
    ref=(double**)malloc(h * sizeof(double*));
    target=(double**)malloc(h * sizeof(double*));
    target2=(double**)malloc(h * sizeof(double*));
    size_t wd=w*sizeof(double);
    for (a=0; a<h; a++)
    {
        dark[a]=(double*)malloc(wd);
        flat[a]=(double*)malloc(wd);
        ref[a]=(double*)malloc(wd);
        target[a]=(double*)malloc(wd);
        target2[a]=(double*)malloc(wd);
    }

其中h = 1040且w = 1388图像的尺寸。

1 个答案:

答案 0 :(得分:2)

您没有提及您正在使用的编译器,IDE或框架。但是,一种解决问题的方法是创建一个新的小型(控制台)项目,仅包含您发布的代码段。这样你就可以消除大多数输入/线程/堆栈/内存/编译器等问题 如果没有,它将足够小,可以在stackoverflow上发布整个样本,让我们分开思考。

你应该为你的算法创建一个独立的单元测试。