我的程序有问题。我需要迭代一个二维数组并对其值进行操作(实际上它是一个.pgm图像)。用于循环的双效果很好,但我想使用指针。所以我试过这样的事情:
#define MAX 256
.
.
.
void blur(int table[][MAX], int x_size, int y_size){
int *ptr = table;
for(int i=0;i<x_size*y_size;i++)
ptr[i]= (int) ((1/3)*(ptr[i-1]+ptr[i]+ptr[i+1]))
}
它仅适用于阵列的一半。将x_size * y_size乘以2可以解决问题,但这不是一种不好的做法吗?
顺便说一下,这个功能应该水平给定图片模糊。这是对的吗?
答案 0 :(得分:0)
使用
void blur(int table[][MAX], int x_size, int y_size)
table
中的blur
是指向int
数组的指针,每个数组MAX
。我不确定这是你想要的,但是如果你的阵列确实是这样形状的,那么每个“行”中都会有MAX - x_size
个未使用的条目。如果您只是尝试通过int
指针和偏移来访问条目,您也将访问这些未使用的条目。
除此之外,从int (*)[MAX]
(指向int
数组的指针,这是您实际传递给函数的指针)转换为int *
(指向int
的指针})不正确,不允许。所以最好完全忘记你的想法。
答案 1 :(得分:0)
菲利克斯指出,你的方法不正确。请考虑以下方法:
int matrix_main(void)
{
int *matrix= malloc(x_size*y_size*sizeof(int));
//
// now fill matrix (not shown)
//
// now blur it
blur(matrix, x_size, y_size);
//...
}
void blur(int *ptr, int x_size, int y_size){
for(int i=0;i<x_size*y_size-1;i++)
ptr[i]= (int) ((1/3.0)*(ptr[i-1]+ptr[i]+ptr[i+1]))
}
请注意,从算法上讲,您正在处理每个像素多次。也许更好地创建一个新的矩阵。然后,您可以将其正确处理为所有周围像素的模糊。