当我在另一个程序中使用此方法时,我遇到了分段错误。我已经确认我的指针是正确的,问题肯定在这个函数中。我假设我试图访问我实际上无法访问的内存。我的问题的解决方案将不胜感激
uint8_t* half( const uint8_t array[], unsigned int cols, unsigned int rows ) {
int length = ((floor(cols/2)) * (floor(rows/2))); // change when we must ignore odd rows/cols
uint8_t* newimg = malloc(length * sizeof(uint8_t));
memset( newimg, 0, length);
int count = 0;
for(unsigned int c = 0; c < cols; c+=2){
for(unsigned int r = 0; r < rows; r+=2){
uint8_t first = array[(c - 1) + ((r - 1) * cols)];
uint8_t second = array[c + ((r - 1) * cols)];
uint8_t third = array[(c - 1) + (r * cols)];
uint8_t fourth = array[c + (r * cols)];
uint8_t mean = (first + second + third + fourth)/4;
newimg[count] = mean;
count++;
}
}
return newimg;
}
答案 0 :(得分:1)
在c
或r
为0
时,请考虑此代码中发生的情况:
uint8_t first = array[(c - 1) + ((r - 1) * cols)];
uint8_t second = array[c + ((r - 1) * cols)];
uint8_t third = array[(c - 1) + (r * cols)];
在0,0
案例中,您尝试访问最有可能超出范围的数组的-1-cols
,-cols
和-1
元素。
答案 1 :(得分:0)
我相信是在这部分引起的
uint8_t first = array[(c - 1) + ((r - 1) * cols)];
uint8_t second = array[c + ((r - 1) * cols)];
uint8_t third = array[(c - 1) + (r * cols)];
uint8_t fourth = array[c + (r * cols)];
uint8_t mean = (first + second + third + fourth)/4;
其中计算结果可能应该更大,使用printf
检查此打印计算结果并检查它是否超过数组大小
答案 2 :(得分:0)
我明白了。首先,我有一个seg错误,因为我从第一个数组的错误部分开始,在第一次迭代期间,我将从索引中减去一个并超出数组的范围。其次,我正在以错误的顺序绘制新图像,这是通过切换我的for循环标题的顺序来解决的,我正在绘制图像而不是沿着它,我生成的图像看起来像一个像素的混乱。我的代码现在有效,谢谢输入eveyrone