2013-07-25 12 views
0

由於聲明的問題,我被我的程序卡住了。當我在將一個計算值分配給一個數組之前或之後放置printf語句時,我得到正確的答案。否則,這是一個奇怪的數字。這個數字是相當一致的,但。 printf不必包含與數組相關的任何內容。我檢查了這個answer,但沒有得到太多。下面是我的代碼部分:printf()會影響c中的一個變量的情況是什麼?

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); 
    } 
} 
} 
+0

聽起來像你在某處訪問該數組越界,否則覆蓋堆棧。 –

+0

Printf應該只會引起與從數據讀取相關的效果。並寫入文件。也許顯示一些代碼,所以少投機是必要的? – wallyk

+0

在將值賦給變量之前,是否有可能嘗試打印變量的值? – mti2935

回答

1

的唯一方式printf應該能夠影響變量是通過%n格式說明符。

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

如果什麼都被修改,那麼你的程序必須調用未定義行爲地方。我建議從Valgrind(或類似的)開始追蹤。

相關問題