0

述べられた問題のために、私は自分のプログラムで立ち往生しています。計算値を配列に代入する前または後にprintfステートメントを配置すると、正しい答えが得られます。そうでなければ、それは奇妙な数です。ただし、数はかなり一貫しています。printf には、配列に関連するものを含める必要はありません。私はこの答えをチェックしましたが、あまり役に立ちませんでした。以下は私のコードの一部です:

int xcorr(Imdata, Kernel, sizeIm, sizeKernel, result_im)
unsigned short** Imdata;
unsigned short** Kernel;
long sizeIm[2], sizeKernel[2];
float** result_im;
{
register float Imstd, Imavg, Kernelstd, Kernelavg, combine_avg, outtmp, area;
register int bufYsize, bufXsize;
    int i,j,r,c;
register unsigned short *ImdataPtr, *KernelPtr;
register float *result;
register float val1, val2;

// kernel average and standard deviation are constant throughout this function
area = sizeKernel[0]*sizeKernel[1];
outtmp = Kernelavg = 0;

// Using the One-pass standard variance algorithm
for(i=0;i<sizeKernel[0];i++){
    KernelPtr = Kernel[i];
       for(j=0;j<sizeKernel[1];j++){
           val1 = KernelPtr[j];
        Kernelavg += val1;
        outtmp += val1*val1;
    }
}
Kernelavg /= area;
outtmp /= area;

// now the standard deviation
Kernelstd = sqrt(outtmp - Kernelavg*Kernelavg);

  /////////////////////////////////////////////////
  // Perform Correlation
  /////////////////////////////////////////////////
  bufYsize = sizeIm[0] - sizeKernel[0] + 1;
  bufXsize = sizeIm[1] - sizeKernel[1] + 1;

for(i=0;i<bufYsize;i++){
    result = result_im[i];
    for(j=0;j<bufXsize;j++){    
        combine_avg = outtmp = Imavg = 0;

        // Using one-pass method for standard variance:
        for (r = 0; r < sizeKernel[0]; r++){
            KernelPtr = Kernel[r];
            ImdataPtr = Imdata[i+r];
            for (c = 0; c < sizeKernel[1]; c++){
                val1 = KernelPtr[c];
                val2 = ImdataPtr[j+c];
                Imavg += val2;
                outtmp += val2*val2;
                combine_avg += val1*val2;
            }
        }
        outtmp /= area;
        Imavg /= area;
        // standard deviation
        if((Imstd = outtmp - Imavg*Imavg)<=SMALL_VAR){
            result[j] = 0;
            continue;
        }
        Imstd = sqrt(outtmp - Imavg*Imavg);

        combine_avg /= area;
        result[j] = (float)combine_avg-(Imavg*Kernelavg))/(Kernelstd*Imstd);

    }
}
return 0;
}

エラーは結果にあり、次のようにメインに割り当てられます。

result = (float**)malloc(bufYsize*sizeof(float*));
if(result == NULL){
    printf("Error allocating the output array (pair num=%d)\n",k+1);
    xit_status = 1; //exit(EXIT_FAILURE);
    }
else{
for(i=0;i<bufYsize;i++){
    result[i]=malloc(bufXsize*sizeof(float));
       if(result[i]==NULL){ 
       printf("Error allocating the output array at row %d, pair %d\n",i,k+1);
    exit_status = 1; //exit(EXIT_FAILURE);
    }
 }
}
4

1 に答える 1

1

printf変数に影響を与える唯一の方法は、%nフォーマット指定子を使用することです。

int x;
printf("foo%nbar\n", &x);
printf("%d\n", x);  // 3

他の何かが変更されている場合、プログラムはどこかで未定義の動作を呼び出しているに違いありません。これを追跡するには、Valgrind (または同様のもの) から始めることをお勧めします。

于 2013-07-25T19:07:27.697 に答える