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 as:

エラー: 割り当てに互換性のない型

私はこれで遊んだので、代わりに関数に次のような配列がある場合:

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

上記は意図したとおりに機能します。

質問

  • グローバル配列ではなく、関数ベースの配列に対してこれを行うことができるのはなぜですか?
  • グローバル配列に対してこれを行いたい場合、どうすればよいですか?
  • 上記の目的をどのように達成したいですか?

ありがとうございました。

4

2 に答える 2

4

グローバル配列ではなく、関数ベースの配列に対してこれを行うことができるのはなぜですか?

関数パラメーターとしての配列はポインターに減衰しdataます。例では、 type のローカル変数にすぎunsigned char*ません。必要に応じて変更できます。TXただし、(私が思うに)静的配列であり、変更可能なポインターではありません。

グローバル配列に対してこれを行いたい場合、どうすればよいですか?

まず、それが本当にやりたいことかどうかを確認してください。の値を変更すると、 の呼び出しだけでなく、 の値を逆参照している次のすべての命令にもTX影響します。CRC8TX

例として、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;
}
于 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 に答える