C语言如何给一个结构体中的多个成员分配相同的值
How to assign the same value to multiple members in a struct in 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
一种方法是
image[i][j].rgbtBlue = image[i][j].rgbtGreen = image[i][j].rgbtRed = average;
如果您厌倦了输入“image[i][j]
”,并且您在同一段代码中用它做了很多事情,您可以设置一个临时变量:
RGBTRIPLE *trip = &image[i][j];
trip->rgbtBlue = trip->rgbtGreen = trip->rgbtRed = average;
像这样设置一个临时变量有利也有弊:
- Pro:它节省了输入
- 缺点:但节省输入并不是真正的目标,您只需输入一次
- Pro: 可以更容易阅读
- 缺点:如果您不小心(如果
i
或 j
在您意想不到的时候发生变化),它可能会引入错误
您可以创建包含默认初始化值的只读结构:
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;
}
我能想到的 2 个简单方法:
- 使用函数:
即
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 对你来说稍微容易一些,并且更清楚发生了什么
(既然大家提供的方案不一样,那我也提一下我的吧!)
一个选择是使用复合文字来保存一个临时的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
可以更改为 returns 和 RGBTRIPLE
:
的函数
RGBTRIPLE MK_RGB(BYTE r, BYTE g, BYTE b)
{
RGBTRIPLE rgb;
rgb.rgbtRed = r;
rgb.rgbtGreen = g;
rgb.rgbtBlue = b;
return rgb;
}
我想知道是否有更简洁的方法可以将同一个变量分配给同一结构的多个成员?
目前我的代码如下所示:
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
一种方法是
image[i][j].rgbtBlue = image[i][j].rgbtGreen = image[i][j].rgbtRed = average;
如果您厌倦了输入“image[i][j]
”,并且您在同一段代码中用它做了很多事情,您可以设置一个临时变量:
RGBTRIPLE *trip = &image[i][j];
trip->rgbtBlue = trip->rgbtGreen = trip->rgbtRed = average;
像这样设置一个临时变量有利也有弊:
- Pro:它节省了输入
- 缺点:但节省输入并不是真正的目标,您只需输入一次
- Pro: 可以更容易阅读
- 缺点:如果您不小心(如果
i
或j
在您意想不到的时候发生变化),它可能会引入错误
您可以创建包含默认初始化值的只读结构:
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;
}
我能想到的 2 个简单方法:
- 使用函数:
即
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 对你来说稍微容易一些,并且更清楚发生了什么
(既然大家提供的方案不一样,那我也提一下我的吧!)
一个选择是使用复合文字来保存一个临时的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
可以更改为 returns 和 RGBTRIPLE
:
RGBTRIPLE MK_RGB(BYTE r, BYTE g, BYTE b)
{
RGBTRIPLE rgb;
rgb.rgbtRed = r;
rgb.rgbtGreen = g;
rgb.rgbtBlue = b;
return rgb;
}