如何在C中为结构中的多个成员分配相同的值



我想知道是否有更简洁的方法将同一变量分配给同一结构的多个成员?

目前我的代码如下:

image[i][j].rgbtBlue = average;
image[i][j].rgbtGreen = average;
image[i][j].rgbtRed = average;

这似乎是一种重复。我不想以任何方式更改结构,我只是想知道是否有任何方法可以让上面的代码更整洁?但这是结构的代码。

typedef struct
{
BYTE  rgbtBlue;
BYTE  rgbtGreen;
BYTE  rgbtRed;
} __attribute__((__packed__))
RGBTRIPLE;

TIA-

您可以创建一个包含默认初始化值的只读结构:

const RGBTRIPLE RGB_default = 
{ 
.rgbtBlue  = average, 
.rgbtGreen = average,
.rgbtRed   = average,
};

然后:

RGBTRIPLE something[n];
for(size_t i=0; i<n; i++)
{
something[i] = RGB_default;
}

一种方法是

image[i][j].rgbtBlue = image[i][j].rgbtGreen = image[i][j].rgbtRed = average;

如果你厌倦了键入";CCD_ 1";,如果你在同一段代码中使用它做了很多工作,你可以设置一个临时变量:

RGBTRIPLE *trip = &image[i][j];
trip->rgbtBlue = trip->rgbtGreen = trip->rgbtRed = average;

设置这样的临时变量有一些优点和缺点:

  • Pro:节省打字
  • Con:但节省打字并不是真正的目标,你只打一次
  • Pro:可以更容易阅读
  • Con:如果你不小心(如果ij在你意想不到的时候发生了变化(,它可能会引入错误

(由于每个人都提供不同的解决方案,我也会提到我的解决方案!(

一种选择是使用复合文字来保存用所需值填充的临时RGBTRIPLE。由于以RGB顺序指定值以匹配类型名称似乎很方便,因此可以定义一些方便的宏来构建复合文字:

#define MK_RGB(r, g, b) ((RGBTRIPLE){ .rgbtBlue = (b), .rgbtGreen = (g), .rgbtRed = (r) })
#define MK_GREY(g) MK_RGB(g, g, g)

然后原始代码行:

image[i][j].rgbtBlue = average;
image[i][j].rgbtGreen = average;
image[i][j].rgbtRed = average;

可更改为:

image[i][j] = MK_RGB(average, average, average);

或:

image[i][j] = MK_GREY(average);

注:C11中添加了复合文字。为了符合旧的C标准,MK_RGB可以更改为返回RGBTRIPLE:的函数

RGBTRIPLE MK_RGB(BYTE r, BYTE g, BYTE b)
{
RGBTRIPLE rgb;
rgb.rgbtRed = r;
rgb.rgbtGreen = g;
rgb.rgbtBlue = b;
return rgb;
}

我能想到的两种简单方法:

  1. 使用函数:

即。

void RGBstructSet(RGBTRIPLE *lStruct,uint8_t value){
lStruct->rgbtBlue = value;
lStruct->rgbtGreen = value;
lStruct->rgbtRed = value;
}

然后您的上述3行将被替换为:

structSet(&image[i][j], average);
  • 使用memset,因为您的结构是";"打包";即

    memset(&image[i][j],average,3)
    
  • 1的好处是,无论你的结构是否被打包,它都可以工作,2对你来说稍微容易一些,并且更清楚发生了什么

    最新更新