【发布时间】:2017-03-23 10:02:50
【问题描述】:
假设我有几个在枚举中定义的硬件寄存器:
typedef enum registers
{
REG1 = 0,
REG2 = 1,
REG3 = 2,
REG4 = 4,
REG5 = 6,
REG6 = 8,
REG_MAX,
}
我对这些寄存器有默认值(其实还没决定用哪种方式定义它们,#define、数组还是枚举...):
// This is just conceptual, not really an enum, array or #define :)
typedef enum values
{
VALUE_REG1 = A,
VALUE_REG2 = B,
VALUE_REG3 = C,
VALUE_REG4 = 53,
VALUE_REG5 = 88,
VALUE_REG6 = 24,
MAX_NUM_REG_VALUES
}
我有一个可以读取硬件寄存器的函数:
uint8 readRegs(uint8 regaddr);
现在我想遍历registers,并在每个元素上调用readRegs() 函数并将其与枚举regvalues 进行比较。它看起来像:
registers regs;
reg_values values;
uint8 readfromregs;
for (regs = REG1; regs <= REG_MAX; regs++)
{
readfromregs = readRegs(regs);
for (values = VALUE_REG1; reg_values <= MAX_NUM_REG_VALUES; reg_values++)
{
if (readfromregs != values)
{
// Value not correct
}
else
{
// value correct
}
}
}
这不起作用,因为无法以这种方式迭代枚举。有人有更好的解决方案吗?如何定义构造enum reg_values?
枚举寄存器必须是固定的(这不能改变数组)。
【问题讨论】:
-
MAX_NUM_REG_VALUES是 25,所以你知道。 -
当然是一个数组。您可以定义对或结构的数组(例如,pair
)。 -
@KonstantinL 这看起来很像 C++,而不是 C。但是,是的,一些非 C++ 数据类型的数组。
-
对不起。好吧,那么只使用一个结构数组: struct CRegister { int register;整数默认值; } registerArray[100];
-
REG_MAX技巧只应在枚举数相邻时使用,此处并非如此。