在C中通过引用传递的二维数组

时间:2015-05-26 10:56:33

标签: c arrays

我想为图像处理应用程序实现可配置的过滤器。

对于这个,我有一个方形内核,通常这个用于Sobel滤波器的第一次传递

-1 0 1
-2 0 2
-1 0 1

我可以将我的内核声明为固定数组:

#define KERNEL_SIZE 3
int8_t kernel[][KERNEL_SIZE] = {{0,0,0},{0,0,0},{0,0,0}};

使用此解决方案很容易将内核传递给过滤功能:

void filter(char* pixels, kernel[][KERNEL_SIZE]);

然而,按值传递内核并不是很明智,特别是如果内核很大并且我的目标是允许可变内核大小。

我发现的实际解决方案是写下这个:

size_t kernel_size = 3;
int8_t *kernel = malloc(sizeof(int8_t)*kernel_size*kernel_size);

void filter(char* pixels, char *kernel, size_t kernel_size);

不幸的是我对此并不满意,因为我无法像以前那样轻松访问内核的行和列。

我觉得这不太可读:

for(x = 0; x < kernel_size; x++)
   for(y = 0; y < kernel_size; y++)
      int8_t k = kernel[x + y * kernel_size];

比这个:

for(x = 0; x < kernel_size; x++)
   for(y = 0; y < kernel_size; y++)
      int8_t k = kernel[x][y];

过滤器的原型也没有给出kernel究竟是什么的线索。如果我可以直接表示内核是方形二维数组,那就更好了。不幸的是,以下声明无效:

 void filter(char* pixels, char kernel[][size_t kernel_size]);

另一种方法是使用指针数组:

 void filter(char* pixels, char *kernel[], size_t kernel_size);

但是我怀疑这个解决方案会比前一个解决方案更有效,因为在内存中我会有我的数据+指向每一行的指针并不是很好。

所以,我的问题是:

  

当数组的大小可以变化时,如何通过引用函数正确传递二维数组?

注意:有些人可能会建议使用像ImageMagick这样的工具但是,这里我只是玩C,这个例子是纯粹的教学。我想了解更多如何在C

中传递复杂数组

NOTE-bis :实际上,这个问题的完整解决方案是n维数组的情况。

0 个答案:

没有答案