【问题标题】:Using a global array like a pointer, C使用像指针这样的全局数组,C
【发布时间】:2013-10-15 13:19:58
【问题描述】:

目标

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

上述工作按预期工作。

问题

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

感谢大家的宝贵时间。

【问题讨论】:

    标签: c gcc embedded


    【解决方案1】:

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

    作为函数参数的数组被衰减为指针,在你的例子中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;
    }
    

    【讨论】:

    • 我注意到我一直在尝试做的另一个错误。而不是 TX[5] = CRC8(TX,4);它实际上应该是 TX++;温度 = CRC8(TX,4) ; TX——; TX[5] = 温度;
    • @Volcano 在这种情况下,您根本不必修改TX,只需调用CRC8(TX+1, 4)
    【解决方案2】:

    与其尝试改变数组引用本身,不如:

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

    【讨论】:

    • 不就是TX[6] = CRC8(TX+1,4)TX[13] = CRC8(TX+6,1)为了体现TX值的修改吗?
    • 你是对的,zakinster,而这种混乱正是为什么弄乱你的数组引用是个坏主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多