我正在编写一个程序,在给定BMP文件的情况下进行一些图像过滤.我有一个为我做过滤的函数,但需要我得到的特定输入,stdin
我的程序需要将它们放入正确的格式.其中一个函数输入需要是一个浮点数组.此数组的大小由用户平方输入的数组宽度确定.因此输入3将产生一个大小为9的数组(模拟矩阵.为了进一步阅读我正在做的事情,请查看此Wikipedia链接).
我的程序正确接收过滤器宽度.它正确计算数组/矩阵大小值.但是,当初始化浮点数组以将值放入时,它会错误地执行此操作.
这是相关代码:
int filter_width; filter_width = atoi(argv[3]); // Initializing variables for the filter weights array int filter_matrix_size; filter_matrix_size = filter_width*filter_width; float filter_weights[filter_matrix_size];
对于3的滤波器宽度输入,我应该在这里为我的3个变量获取以下值:
过滤宽度:3
滤镜矩阵大小:9
大小filter_weights[]
= 9
但是当我测试我的程序时,我的大小filter_weights[]
是36.我不知道这个数字来自哪里,它正在破坏图像过滤.我在这里错过了什么吗?
sizeof
计算数组的总大小,而不是元素的数量.假设sizeof(float) == 4
你的系统,那么你就拥有了
sizeof(float) == 4 sizeof(float[2]) == 8 (2 * sizeof(float)) sizeof(float[9]) == 36 (9 * sizeof(float))
如果你想要元素的数量,你可以除以第一个元素的大小
float arr[N]; (sizeof arr / sizeof arr[0]) == N sizeof arr == (N * sizeof(float)) sizeof arr[0] == sizeof(float)
程序员经常为此定义一个宏:
#define LEN(A) (sizeof (A) / sizeof (A)[0]) float arr[N]; LEN(arr) == N
虽然我个人远离它,因为当使用指针而不是数组时它可能会令人困惑.
float *arr = malloc(/*whatever*/); LEN(arr) == sizeof(float*)