繁体   English   中英

您可以为 C 中的二维数组的结构中的所有元素分配值吗?

[英]Can you assign values to all elements in struct for a 2D array in C?

我想制作一个灰度滤镜,所以我必须将所有 3 个 RGB 值的平均值分配给每个值。 我使用二维数组,因为这是 bitmap 图像,我通过更改每个像素对其进行过滤。

这是结构的定义方式(其中BYTEuint8_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM