目标
我有一个全局TX数组,以及一个必须在此数组中前进的CRC函数。 CRC功能不应处理第一个字节。为了避免这种情况,我试图通过TX ++来增加数组。这导致了问题。
问题
请快速查看以下代码:
void Send_To_Manager(void)
{
TX[0] = 0x55;
TX[1] = 0x00;
TX[2] = 0x01;
TX[3] = 0x00;
TX[4] = COMMON_COMMAND;
TX++;
TX[5] = CRC8(TX,4);
TX[6] = CO_RD_VERSION;
TX += 5;
TX[7] = CRC8(TX,1);
TX -= 6;
UART_TX(8);
}
我想使TX阵列中第一个字节的CRC8功能失效。通过执行TX ++,我期望TX [0]为0x00。但是我收到了错误:
错误:要递增的错误类型参数
我也得到TX + = 5的错误;和TX - = 6 as:
错误:分配中的不兼容类型
我玩这个,所以相反,如果函数有一个数组,如:
void Send_To_Manager(unsigned char data[100])
{
data++;
}
以上是按预期工作的。
问题
谢谢大家的时间。
答案 0 :(得分:4)
为什么我可以为基于函数的数组而不是全局数组执行此操作?
作为函数参数的数组被衰减为指针,示例中的data
只是一个类型为unsigned char*
的局部变量,您可以根据需要进行修改。 TX
然而(我想)是一个静态数组,而不是一个可修改的指针。
如果我确实希望为全局数组执行此操作,我该怎么办?
首先,确保您真正想做的事情。修改TX
的值不仅会影响对CRC8
的调用,还会影响取消引用TX
值的所有以下说明。
例如,TX++; TX[5] = CRC8(TX,4);
相当于TX[6] = CRC8(TX+1,4); TX++;
。
如果您不想要副作用,请不要更改TX
的值,只需使用CRC8(TX+1,4)
和CRC8(TX+5,4)
。
但是,如果这真的是你想要的,那么你将不得不使用一个临时指针:
void Send_To_Manager(void)
{
char* myTX = TX;
myTX[0] = 0x55;
myTX[1] = 0x00;
myTX[2] = 0x01;
myTX[3] = 0x00;
myTX[4] = COMMON_COMMAND;
myTX++;
myTX[5] = CRC8(myTX,4);
myTX[6] = CO_RD_VERSION;
myTX += 5;
myTX[7] = CRC8(myTX,1);
myTX -= 6;
UART_TX(8);
}
如果必须保留myTX
的增量以便下次调用Send_To_Manager
,则可以使其对函数保持静态。如果TX
的修改必须反映在整个程序中,那么您就会遇到强大的架构问题。
您希望如何实现上述目标?
如果TX
的修改只影响Send_To_Manager
功能,则上述解决方案可以正常运行。在其他情况下,您将不得不重新考虑您的程序架构。一种可能的解决方案是将当前进度状态作为参数传递,而不是使用全局状态变量。
char* Send_To_Manager(char* currentTX)
{
currentTX[0] = 0x55;
...
currentTX[4] = COMMON_COMMAND;
currentTX++;
...
return currentTX;
}
答案 1 :(得分:1)
不是试图改变数组引用本身,为什么不:
TX[5] = CRC8(TX+1,4);
TX[7] = CRC8(TX+6,1);