使用像指针一样的全局数组

时间:2013-10-15 13:19:58

标签: c gcc embedded

目标

我有一个全局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++; 
}

以上是按预期工作的。

问题

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

谢谢大家的时间。

2 个答案:

答案 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);