c结构的初始化,包括union
我想用以下值初始化以下结构的c结构的初始化,包括union,c,struct,initialization,union,C,Struct,Initialization,Union,我想用以下值初始化以下结构的colormodelblock: extension\u size=4 model=0 red=0 green=0 blue=0 typedef struct { int extension_size; ColourModelData ext; } ColourModelBlock; typedef struct { unsigned int model;
colormodelblock
:
extension\u size=4
model=0
red=0
green=0
blue=0
typedef struct {
int extension_size;
ColourModelData ext;
} ColourModelBlock;
typedef struct {
unsigned int model;
union {
struct {
int red; /* % */
int green; /* % */
int blue; /* % */
} rgb;
struct {
int cyan; /* % */
int magenta; /* % */
int yellow; /* % */
int key; /* % */
} cmyk;
struct {
int hue; /* angle (degrees) */
int saturation; /* % */
int value; /* % */
} hsv;
char bytes[16];
int words[4];
} data;
} ColourModelData;
任务似乎很简单,但我尝试直接设置值(这对extension\u size
和model
有效,但我不知道如何设置联合值)或使用int
数组的memcpy
但是我对C很陌生,所以我可能把它搞砸了。红色绿色和蓝色字段位于名为
数据
的联合体中名为rgb
的结构中。如果您有一个名为colormodeldata
的colormodeldata
类型的变量,您可以如下设置其RGB:
colormodeldata.data.rgb.red=0;
colormodeldata.data.rgb.green=0;
colormodeldata.data.rgb.blue=0;
红色绿色
和蓝色
字段位于名为rgb的结构内部,位于名为数据
的联合中。如果您有一个名为colormodeldata
的colormodeldata
类型的变量,您可以如下设置其RGB:
colormodeldata.data.rgb.red=0;
colormodeldata.data.rgb.green=0;
colormodeldata.data.rgb.blue=0;
首先,在定义colormodelblock
之前,必须声明colormodelblock
然后,关于如何初始化colormodelblock
,有几种选择。首先,要初始化结构,可以在大括号中列出它们的值。当涉及联合时,将初始化联合的第一个成员:
ColourModelBlock x = { 4, { 0, {{ 0, 0, 0 }} } };
这里,内部大括号遵循colormodelblock
的结构,对每个包含的struct
或union
使用{/code>。编译器将接受没有这些大括号的代码,并按相同的顺序初始化,但它可能会警告您,最好使用大括号,因为它将帮助捕获错误
第二,您可以使用成员名称来指示使用每个值初始化的成员。这还允许您通过第一个成员以外的其他成员初始化联合,尽管此处没有这样做:
ColourModelBlock x = {
.extension_size = 4,
.ext = {
.model = 0,
.data.rgb = { 0, 0, 0 }
}
};
请注意,上述方法实际上使用了多种方法的组合。大多数成员都是通过名称初始化的,称为指定的初始值设定项。但是,.data.rgb
将一个联合命名,然后使用列表初始化其成员,就像第一个方法一样。在这种情况下,rgb
成员被视为三元组时,这可能很自然
您还可以定义对象,然后使用赋值语句为其赋值。上面的语法用于初始化。赋值需要不同的语法:
ColourModelBlock x;
x.extension_size = 4;
x.ext.model = 0;
x.ext.data.rgb.red = 0;
x.ext.data.rgb.green = 0;
x.ext.data.rgb.blue = 0;
可以使用复合文字在赋值中使用初始化语法。要创建复合文字并在赋值中使用它,请使用上面的任何初始化列表,并将类型名称放在前面的括号中,然后将其用作赋值的右侧:
x = (ColourModelBlock) { 4, { 0, {{ 0, 0, 0 }} } };
最后,由于要用作初始值的大多数值都是零,因此可以忽略它们。如果正在初始化结构,并且没有为所有成员提供显式值,则没有显式值的成员将被初始化为零(对于指针,则为空指针):
首先,在定义colormodelblock
之前,必须先声明colormodelblock
然后,关于如何初始化colormodelblock
,有几种选择。首先,要初始化结构,您可以在大括号中列出它们的值。当涉及联合时,将初始化联合的第一个成员:
ColourModelBlock x = { 4, { 0, {{ 0, 0, 0 }} } };
这里,内部大括号遵循colormodelblock
的结构,对每个包含的struct
或union
使用{/code>。编译器将接受没有这些大括号的代码,并按相同的顺序初始化,但它可能会警告您,最好使用大括号,因为它将帮助捕获错误
第二,您可以使用成员名称来指示使用每个值初始化的成员。这还允许您通过第一个成员以外的其他成员初始化联合,尽管此处没有这样做:
ColourModelBlock x = {
.extension_size = 4,
.ext = {
.model = 0,
.data.rgb = { 0, 0, 0 }
}
};
请注意,上述方法实际上使用了多种方法的组合。大多数成员都是通过名称初始化的,称为指定的初始值设定项。但是,.data.rgb
将一个联合命名,然后使用列表初始化其成员,就像第一个方法一样。在这种情况下,rgb
成员被视为三元组时,这可能很自然
您还可以定义对象,然后使用赋值语句为其赋值。上面的语法用于初始化。赋值需要不同的语法:
ColourModelBlock x;
x.extension_size = 4;
x.ext.model = 0;
x.ext.data.rgb.red = 0;
x.ext.data.rgb.green = 0;
x.ext.data.rgb.blue = 0;
可以使用复合文字在赋值中使用初始化语法。要创建复合文字并在赋值中使用它,请使用上面的任何初始化列表,并将类型名称放在前面的括号中,然后将其用作赋值的右侧:
x = (ColourModelBlock) { 4, { 0, {{ 0, 0, 0 }} } };
最后,由于要用作初始值的大多数值都是零,因此可以忽略它们。如果正在初始化结构,并且没有为所有成员提供显式值,则没有显式值的成员将被初始化为零(对于指针,则为空指针):