2014-11-09 2 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 (I = 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 = 16 и stepSize = 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; 

(зависит от ширины и длины шага единиц измерения).

Смежные вопросы