我有一个应用程序需要在struct上执行CRC操作。我决定实现这一目标的最佳方法是简单地遍历构成结构的所有单个字节并将它们添加到CRC例程中。 strict命名为 Config ,类型为 ConfigT 。下面的代码大致描述了我想要做的事情,我只需要使用指针算法来获取结构的一个字节的语法。
uint16_t CalculateEepromChecksum()
{
uint16_t crc = 0;
uint8_t *ptr = &Config;
for (uint32_t i = 0; i < sizeof(ConfigT); i++)
{
crc = _crc16_update(crc, ptr[i]);
}
return crc;
}
此功能无法编译:
cannot convert 'ConfigT*' to 'uint8_t* {aka unsigned char*}' in initialization
...在以下行:
uint8_t *ptr = &Config;
答案 0 :(得分:1)
您需要将crc
的地址传递给_crc16_update
才能对其进行修改。如果你不这样做,并且它不是一个编译错误,那么你最多可以期待未定义的行为。
_crc16_update(&crc, *(ptr+i));
此外,您可以在struct
字节数组上使用数组表示法而不是指针表示法。两种形式的工作方式相同,但第一种形式可能更好地表明您正在使用字节数组:
_crc16_update(&crc, ptr[i]);
答案 1 :(得分:1)
您不能为彼此分配不同的指针类型,因为它们不兼容。如果需要,您必须明确地将其转换为其他类型
uint8_t *ptr = (uint8_t *)&Config;
或者更好,将_crc16_update声明为_crc16_update(uint16_t *crc, void* data, int length);
并在函数内循环,而不是为每个字节调用