我试图垂直翻转图像(在C中)。这是我到目前为止所做的。我认为它在理论上有效,但是当我运行它时,我会遇到分段错误。我几天前设法修复了这个错误,但我没有保存它。我看到的这个功能在我尝试运行时会出现分段错误。有没有办法解决它,以便它不会给出该错误并垂直翻转图像?
void vertical( uint8_t array[],
unsigned int cols,
unsigned int rows )
{
unsigned int top = 0;
unsigned int bottom = rows-1;
for(int r = 0; r < cols; r++)
{
while(top != bottom && bottom > top)
{
int index1= r * cols + top;
int index2= r * cols + bottom;
int temp= array[index1];
array[index1]= array[index2];
array[index2] = temp;
bottom++;
top++;
}
top =0;
bottom= rows-1;
}
}
答案 0 :(得分:1)
int index1= r * cols + top;
关闭,因为top是一行,它应该乘以列数,r是当前正在翻转的列。所以它应该是int index1 = top * cols + r;
。但是r
是一个令人困惑的名称,因为它是一个列索引。
正如其他人评论的那样,底部应该在循环中递减。
--bottom;
以避免在数组边界之外进行索引,这会导致段错误。
此条件while(top != bottom && bottom > top)
相当于while (bottom > top)
。
通常最好(在C中)首先迭代行中的列,因为C是行主要的,它也简化了代码,并允许您避免从头开始计算索引。每个外部迭代通过添加/减去一行中的列数向下/向上移动整行。
void vertical(uint8_t array[], unsigned int cols, unsigned int rows) {
int top = 0;
int bottom = (rows - 1) * cols;
while (top < bottom) {
for (int c = 0; c < cols; ++c) {
int temp = array[top + c];
array[top + c] = array[bottom + c];
array[bottom + c] = temp;
}
top += cols;
bottom -= cols;
}
}