[英]Can you assign values to all elements in struct for a 2D array in C?
我想制作一个灰度滤镜,所以我必须将所有 3 个 RGB 值的平均值分配给每个值。 我使用二维数组,因为这是 bitmap 图像,我通过更改每个像素对其进行过滤。
这是结构的定义方式(其中BYTE
是uint8_t
):
typedef struct
{
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
} __attribute__((__packed__))
RGBTRIPLE;
我是否需要像下面那样将值分别分配给结构的每个元素,或者有没有办法将该值分配给数组中特定位置的结构的所有元素(因为它们是相同的类型)一次?
这是过滤 function 的代码。
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
for (int i = 0; i < height; i++)
{
for (int j = 0 ; j < width; j++)
{
image[i][j].rgbtBlue = (image[i][j].rgbtBlue + image[i][j].rgbtRed + image[i][j].rgbtGreen)/3;
image[i][j].rgbtGreen = (image[i][j].rgbtBlue + image[i][j].rgbtRed + image[i][j].rgbtGreen)/3;
image[i][j].rgbtRed = (image[i][j].rgbtBlue + image[i][j].rgbtRed + image[i][j].rgbtGreen)/3;
}
}
return;
}
您可以使用复合文字来做到这一点:
RGBTRIPLE x = image[i][j]; // Use temporary to reduce repetition.
BYTE t = (x.rgbtBlue + x.rgbtRed + x.rgbtGreen)/3;
image[i][j] = (RGBTRIPLE) { t, t, t };
您当然可以避免在每个循环上进行三次计算。 两种明显的方法是:
(1) 链接赋值(注意像a = b = 3;
这样的表达式是有效的 C 并且=
运算符从右到左关联);
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
image[i][j].rgbtBlue = image[i][j].rgbtGreen = image[i][j].rgbtRed =
(image[i][j].rgbtBlue + image[i][j].rgbtRed + image[i][j].rgbtGreen) / 3;
}
}
return;
}
(2) 使用从该计算值构造的复合文字计算该“灰色”值并将其分配给数组元素(一次):
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
BYTE gray = (image[i][j].rgbtBlue + image[i][j].rgbtRed + image[i][j].rgbtGreen) / 3;
image[i][j] = (RGBTRIPLE){ gray, gray, gray };
}
}
return;
}
上述任何一个是否真正构成改进是主观的(一个好的编译器可能会在两种情况下生成相同的代码)。 但是,对于更复杂的情况,这些技术可以使您的代码更清晰,其目的更易于读者理解。
另请注意,正如评论中所指出的,上述两个示例将为image[i][j]
元素的三个组件中的每一个分配相同的值。 在您发布的代码中,第二次和第三次重新计算使用一个或两个值,这些值将被前一行修改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.