uint8_t
/ uint16_t
或者 uint32_t
。我在函数中进行了一个无参数的实验。void printf_crc_table(void *pt, uint8_t crc_length) {
for (uint8_t i = 0; i < 16; i++) {
for (uint8_t k = 0; k < 16; k++) {
switch (crc_length) {
case 16:
printf("0x%04X, ", *(uint16_t*)pt);
break;
case 32:
printf("0x%08X, ", *(uint32_t*)pt);
break;
default:
printf("0x%02X, ", *(uint8_t*)pt);
break;
}
pt++; //works only for uint8_t. For uint16_t it has to be pt+=2;
}
printf("\n");
}
}
我遇到的问题是:增加指针地址+1 仅对 uint8_t1
的表格有效。
如果我使用uint16_t
元素类型调用函数,则每隔一个值都不正确,将指针地址增加2
可以修复此问题。但是为什么?如何调用/重写函数以始终打印正确的值?
在main
中,我这样调用函数:
printf_crc_table(crc8_0x07_t, 8); // works fine
printf_crc_table(crc16_0x1021_t, 16); // every second value is printed incorrectly.
我可以一直使用uint32_t
并将简单的uint8_t
转换为uint32_t
,但我希望尽可能地利用微控制器的资源。是否使用uint32_t
而不是void
更好?
crc_length
是什么,因此您可以为每个编写一个函数。如果您担心代码空间,则不要使用双重循环。 - Weather Vanevoid
指针进行算术运算。然而,它也没有禁止这样做。C标准鼓励对语言进行扩展,GCC定义了对void
指针进行算术运算。您可以使用GCC对void
指针进行算术运算。 - Eric Postpischilvoid
指针进行算术运算的程序。而且,事实上,GCC支持这一点:当你尝试它时,它确实发生了,因此是可能的。 - Eric Postpischil