遍历 C 中的枚举?

Joh*_*Doe 7 c enums

假设我有几个在枚举中定义的硬件寄存器:

typedef enum registers
{
    REG1 = 0,
    REG2 = 1,
    REG3 = 2,
    REG4 = 4,
    REG5 = 6,
    REG6 = 8,
    
    REG_MAX,
    
}
Run Code Online (Sandbox Code Playgroud)

我有这些寄存器的默认值(实际上并没有决定以哪种方式定义它们,#define、array 或 enum...):

// 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    
}
Run Code Online (Sandbox Code Playgroud)

我有一个可以读取硬件寄存器的函数:

uint8 readRegs(uint8 regaddr);
Run Code Online (Sandbox Code Playgroud)

现在我想循环遍历registers,并在每个元素上调用该readRegs()函数并将其与 enum 进行比较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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将不起作用,因为不可能以这种方式在枚举中迭代。有人有更好的解决方案吗?如何定义构造enum reg_values?该枚举寄存器必须是固定的(这不能更改数组)。

Jer*_*myP 7

我可能会定义一个结构

struct RegInfo
{
    registers number;
    values defaultValue;
}
Run Code Online (Sandbox Code Playgroud)

然后我将创建一个将寄存器编号与默认值匹配的数组

struct RegInfo registerInfo[] =
{
    { REG1, VALUE_REG1 },
    { REG2, VALUE_REG2 },
    { REG3, VALUE_REG3 },
    { REG4, VALUE_REG4 },
    { REG5, VALUE_REG5 },
    { REG6, VALUE_REG6 },
};
Run Code Online (Sandbox Code Playgroud)

现在迭代寄存器:

for (int i = 0 ; i < sizeof registerInfo / sizeof(RegInfo) ; ++i)
{
    values value = readFromReg( registerInfo[i].number);
    if (value != registerInfo[i].defaultValue)
    {
         // Not the default
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你想要一个内部循环来对抗每个值,除了数组可以直接是值之外的相同技巧

values allValues[] = { VALUE_REG1, Value_REG2, ... , VALUE_REG6 };
Run Code Online (Sandbox Code Playgroud)

您可能会忘记将新值/寄存器放入相关数组中,但这就是单元测试的目的。