2014-11-09 9 views
-1

원시 비디오 YUV 파일에서 일부 컴퓨팅을 수행하고 있습니다. 아이디어는 픽셀 단위로 전체 프레임에 걸쳐 8x8 창을 이동하는 것입니다. 여기에 내 코드입니다 :파일을 읽을 때 액세스 위반 예외가 발생했습니다.

while ((frameNumber < maxFrame) && 
      (fread_s(frame1, frameSize, 1, frameSize, file1)== frameSize) && 
      (fread_s(frame2, frameSize, 1, frameSize, file2)) == frameSize) 
{ 
    unsigned char *p1 = frame1;  //pointer to indicate start of a window 
    unsigned char *p2 = frame2; 
    unsigned char *p8_1 = NULL;  //pointer used to navigate accross 8x8window 
    unsigned char *p8_2 = NULL; 

    for (int i = 0; i < countY; i += stepSize) 
    { 
     p1 += i*width;      //move to next line 
     p2 += i*width; 

     for (int j = 0; j < countX; j += stepSize) 
     { 



      meanLuma1 = 0; 
      meanLuma2 = 0; 

      //8x8 window loop 

      for (int k = 0; k < windowSize; k++) 
      { 
       p8_1 = p1 + k*width;    //move to next line of a window 
       p8_2 = p2 + k*width; 

       for (int l = 0; l < windowSize; l++) 
       { 
        meanLuma1 += *p8_1;  
        meanLuma2 += *p8_2; //Access violation here at i=60, others are 0 
        ++p8_1; 
        ++p8_2; 

       } 

      } 
      meanLuma1 = meanLuma1/(windowSize*windowSize); 
      meanLuma2 = meanLuma2/(windowSize*windowSize); 

      ++p1; 
      ++p2; 

     } 

내가 p8_2에 액세스 위반 예외가 계속 (전 = 60, J, K, L = 0). 이상하게 생각합니다. p8_1은 성공적으로 값을 읽지 만 두 파일의 크기와 크기가 같기 때문에 p8_2은 그렇지 않습니다. 변수 상태는 다음과 같습니다

width=352; 
height=288; 
stepSize=4; 
windowSize=8; 

그리고 다음과 같은 단계의 최대 수를 계산 해요 :

int countX = ((width - windowSize)/stepSize)+1; 
    int countY = ((height - windowSize)/stepSize)+1; 

둘째 낯선 내가 windowSize = 16stepSize = 8을 설정하면, 성공적으로 컴파일 것입니다.

명백한 문제가 보이지 않습니까? 나는 여러 해 동안 버그를 발견하는 데 어려움을 겪고있다.

답변

1

여기 보인다 라인에 오류가 있습니다 :

p1 += i*width;      //move to next line 
p2 += i*width; 

당신은 각 단계에 산술 진행에서 너무 멀리 이동합니다. 시도 :

p1 += width;      //move to next line 
p2 += width; 

또는

p1 += stepSize*width;    //move to next line 
p2 += stepSize*width; 


는 (폭과 스텝 사이즈 측정 단위에 따라 다름).