0

客观的

我有一个全局 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 为:

错误:分配中的类型不兼容

我玩过这个,所以如果函数有一个数组,例如:

void Send_To_Manager(unsigned char data[100])
{
    data++; 
}

上述工作按预期工作。

问题

  • 为什么我可以为基于函数的数组而不是全局数组执行此操作?
  • 如果我确实希望对全局数组执行此操作,我该怎么做?
  • 您希望如何实现上述目标?

谢谢大家的时间。

4

2 回答 2

4

为什么我可以为基于函数的数组而不是全局数组执行此操作?

作为函数参数的数组被衰减为指针,data在您的示例中只是一个带有 type 的局部变量unsigned char*,您可以根据需要对其进行修改。TX但是(我想)是静态数组而不是可修改的指针。

如果我确实希望对全局数组执行此操作,我该怎么做?

首先,确保这确实是您想要做的。修改 的值TX不仅会影响对 的调用,CRC8还会影响以下所有取消引用 的值的指令TX

例如,TX++; TX[5] = CRC8(TX,4);等价于TX[6] = CRC8(TX+1,4); TX++;

如果您不想要那种副作用,请不要更改 的值TX,只需使用CRC8(TX+1,4)and 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;
}
于 2013-10-15T13:27:48.880 回答
1

而不是试图改变数组引用本身,为什么不:

TX[5] = CRC8(TX+1,4);
TX[7] = CRC8(TX+6,1);
于 2013-10-15T13:30:13.550 回答