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

使用像指针一样的全局数组,C,c,gcc,embedded,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[

目标

我有一个全局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++; 
}
上述工作符合预期

问题

  • 为什么我可以对基于函数的数组而不是全局数组执行此操作
  • 如果我确实希望为全局阵列执行此操作,我可以如何执行
  • 您希望如何实现上述目标
谢谢大家抽出时间

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

数组作为函数参数衰减为指针,
数据
在您的示例中只是一个类型为
unsigned char*
的局部变量,您可以根据需要修改它<但是,code>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);     
}
如果下次调用
Send\u to\u Manager
时必须保持
myTX
的增量,则可以将其设置为静态函数。如果必须在整个程序中反映对
TX
的修改,则存在严重的体系结构问题

您希望如何实现上述目标

如果修改
TX
只能影响
Send_To_Manager
功能,则上述解决方案可以。在其他情况下,您必须重新考虑您的程序架构。一种可能的解决方案是将当前进度状态作为参数传递,而不是使用全局状态变量

char* Send_To_Manager(char* currentTX)
{   
    currentTX[0] = 0x55;
    ...
    currentTX[4] = COMMON_COMMAND;     
    currentTX++;
    ...
    return currentTX;
}
为什么我可以对基于函数的数组而不是全局数组执行此操作

数组作为函数参数衰减为指针,
数据
在您的示例中只是一个类型为
unsigned char*
的局部变量,您可以根据需要修改它<但是,code>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);     
}
如果下次调用
Send\u to\u Manager
时必须保持
myTX
的增量,则可以将其设置为静态函数。如果必须在整个程序中反映对
TX
的修改,则存在严重的体系结构问题

您希望如何实现上述目标

如果修改
TX
只能影响
Send_To_Manager
功能,则上述解决方案可以。在其他情况下,您必须重新考虑您的程序架构。一种可能的解决方案是将当前进度状态作为参数传递,而不是使用全局状态变量

char* Send_To_Manager(char* currentTX)
{   
    currentTX[0] = 0x55;
    ...
    currentTX[4] = COMMON_COMMAND;     
    currentTX++;
    ...
    return currentTX;
}

与其尝试更改数组引用本身,为什么不:

TX[5] = CRC8(TX+1,4);
TX[7] = CRC8(TX+6,1);

与其尝试更改数组引用本身,为什么不:

TX[5] = CRC8(TX+1,4);
TX[7] = CRC8(TX+6,1);

为了反映
TX
值的修改,它不是
TX[6]=CRC8(TX+1,4)
TX[13]=CRC8(TX+6,1)
吗?你是对的,zakinster,这种混乱正是弄乱数组引用的坏主意。不是
TX[6]=CRC8(TX+1,4)
TX[13]=CRC8(TX+6,1)
以反映对
TX
值的修改?你是对的,zakinster,这种混乱正是为什么弄乱数组引用是一个坏主意。我注意到我一直在尝试做的事情还有一个错误。它实际上应该是TX++;temp=CRC8(TX,4),而不是TX[5]=CRC8;TX--;TX[5]=temp;@Volcano在这种情况下,您根本不需要修改
TX
,只需调用
CRC8(TX+1,4)
。我注意到我尝试做的事情还有一个错误。它实际上应该是TX++;temp=CRC8(TX+4);TX--;TX[5]=temp;@Volcano在这种情况下,您根本不需要修改
TX
,只需调用
CRC8(TX+1,4)