>我正在尝试创建一个函数来计算数组的校验和。我应该将数组中的所有值相加并取 2 的补码。 我已经测试了我的代码,结果是正确的。 一旦我尝试在单独的函数中实现此代码,结果就是错误的。 有人可以帮我解决这个问题吗?
函数调用为:
uint8_t Testframe[] = {0xAA,0x43,0x10,0x97,0x55,0xBE, 0x6A, 0xEA, 0xF3, 0xBE, 0xF4, 0x71, 0x9D, 0xB2, 0x4B, 0x0B, 0x45, 0x56, 0x55};
uint8_t result2 = 0;
result2 = CalculateChecksum(Testframe);
函数为:
uint8_t CalculateChecksum( uint8_t array[])
{
uint64_t result = 0;
uint8_t output = 0;
for(int i = 0; i < sizeof(array); i++)
{
result = result + array[i];
}
output = (uint8_t) result;
output = output ^ 0xFF;
output = output + 0x01;
return output;
}
结果应该是0x5A
根据您使用的是 32 位还是 64 位寻址,您的for
循环仅迭代4
或8
次,而不是所需的19
次。
这是因为 C 中的数组在作为函数参数传递时总是衰减为指针。
以下语句:
for(int i = 0; i < sizeof(array); i++)
应该导致编译器警告。 我在我的系统上看到这个:
" 23, 30 警告:数组函数参数上的 sizeOf 将返回大小 'uint8_t *'(又名 '无符号字符 *'),而不是 'uint8_t []' ">
这基本上是说sizeof(array)
,一旦array
作为函数参数传递,就会产生sizeof
指针,而不是数组本身sizeof
,从而导致错误的迭代次数。
在原型中传递另一个参数是解决此问题的一种方法。 例如:
uint8_t CalculateChecksum( uint8_t array[], size_t size);
允许函数使用表示数组中元素计数的值:
for(int i = 0; i < size; i++)
{ ...
调用示例:
size_t size = sizeof Testframe/sizeof Testframe[0];//provides number of elements in array
result2 = CalculateChecksum(Testframe, size);
最后,如果尚未将编译器设置为显示警告,请将其更改为显示警告。 (例如,如果使用 GCC-Wall
)