我正在尝试理解代码,该代码是可重用的固件开发指南的一部分。这本书对我来说太难了,但是我仍然想理解代码。
在本书随附的示例代码中,有一个类似于下面的语法
typedef enum
{
DIO_MAX_MODE
}DioMode_t;
typedef enum
{
DIO_PULLUP_DISABLED, /*< Used to disable the internal pull-ups */
DIO_PULLUP_ENABLED, /*< Used to enable the internal pull-ups */
DIO_MAX_RESISTOR /*< Resistor states should be below this value */
}DioResistor_t;
typedef enum
{
DIO_OUTPUT,
DIO_INPUT
}DioDirection_t;
typedef struct
{
DioResistor_t Resistor; /**< Pullup/Pulldown Resistor - ENABLED or DISABLED */
DioDirection_t Direction; /**< Data Direction - OUTPUT or INPUT */
DioMode_t Function; /**< Mux Function - Dio_Peri_Select */
}DioConfig_t;
如果我理解正确,则该结构的成员为枚举变量。
在代码开发人员的一部分中,它以下面的方式为它分配了一个值(不完全是,我试图通过对它进行类似的语法来理解整个过程的工作原理)
DioConfig_t config[] = { {1, 2, 3},
{4, 5, 6}
};
这是怎么回事?这可能吗?
如上初始化时,它会影响枚举的值,哪些值正在更改以及如何访问它们?
编辑:
如果我创建这样的结构
#include <stdio.h>
struct test {
int a;
int b;
};
int main()
{
struct test var[] = { {1, 2}, {3, 4} };
/*
struct test var[0] = {1, 2}
struct test var[1] = {3, 4}
*/
printf("%d %d\n", var[0].a, var[1].a);
return 0;
我知道根据我用来调用结构的哪个变量将它们分配给a
和b
的值
例如:var [0] .a = 1和var 1。a = 3
但是我首先显示的代码具有enum
变量作为结构成员
因此分配给struct成员的值是
config[0].Resistor = 1
config[0].Direction = 2
config[0].Function = 3
由于这些是enum
变量,它将改变enum
的值,如何更改?
PS:开始学习C才几个月。我将其用于开发小型嵌入式项目,阅读了一些在线教程和视频,了解了有关结构和指针的信息,但是当我打开它时,
code,这对我来说意义不大。那正常吗?
答案 0 :(得分:0)
这是怎么回事?这可能吗?
内部括号({1, 2, 3}
和{4, 5, 6}
)分别初始化一个DioConfig_t
。外括号用内括号定义的两个config[]
初始化数组DioConfig_t
。等效于此:
DioConfig_t a = {1, 2, 3};
DioConfig_t b = {4, 5, 6};
DioConfig_t config[] = {a, b};
令人困惑的是,牙套在这里做了两种不同的事情。一种是初始化结构,另一种是初始化数组。
注意:我不确定我的术语是否100%正确,当我说“它们是等效的”时,我并没有考虑性能会因编译器优化级别的不同而有所不同。
对我来说没有多大意义。正常吗?
您是在问被某些C代码混淆是否正常?绝对。语言中有很多技巧,陷阱和晦涩难懂的东西,即使是使用它多年的人也学到了新东西,并时不时被一些棘手的C代码所迷惑/困惑。不要让这种事情阻止您。
答案 1 :(得分:0)
基本上,enum是定义整数常量的另一种方法,因此enum变量必须与整数变量占用相同的内存,因此它基本上可以容纳任何整数值。在您的情况下,类型为{{1} }可以保留0(DioResistor_t
),1(DIO_PULLUP_DISABLED
)和2(DIO_PULLUP_ENABLED
)以外的值。因此可以将其他值初始化为enum结构元素(但可能会导致无效的输出)。
我们现在将讨论将结构元素定义为枚举的原因。为此,请考虑以下两种情况。
情况1:DIO_MAX_RESISTOR
结构的定义如下:
DioConfig_t
情况2:typedef struct
{
unsigned int Resistor;
unsigned int Direction;
unsigned int Function;
}DioConfig_t;
结构的定义如您的代码中所述。
现在,如果开发人员想将一个引脚配置为带有上拉电阻器并处于最大模式的输出引脚。
在第一种情况下,他需要找到配置结构DioConfig_t
的电阻,方向和功能变量的值,这些变量将根据需要配置引脚,但是在第二种情况下,他可以轻松地将其配置为所有必需的值变量的值在枚举中定义。
以上两种情况的配置如下:
情况1:
DioConfig_t
情况2:
Dio_Config_t dio_configuration;
dio_configuration.Resistor = 1;
dio_configuration.Direction = 0;
dio_configuration.Function = 0;
如您所见,第二种情况下的代码更易于理解,并且更安全,因为不会轻易意外更改值。
答案 2 :(得分:0)
enum
是整数类型的特例。在C语言中,为超出该范围的enum
变量赋值是合法的。
将超出范围的值分配给enum
变量也不会影响所定义的任何enum
常量。还请注意,所讨论的变量是结构的成员这一事实不会改变任何内容。
例如:
#include <stdio.h>
typedef enum f {
F1,
F2,
F3
} f;
int main()
{
f x = 4;
printf("F1=%d\n", F1);
printf("F2=%d\n", F2);
printf("F3=%d\n", F3);
printf("x=%d\n", x);
return 0;
}
输出:
F1=0
F2=1
F3=2
x=4
在此示例中,即使关联的f
的值为0、1和2,也将值4分配给类型enum
的变量。