0

ここでは、UART を介してデータを受信するために使用しているバッファから、構造体のメンバーに値を割り当てる際に問題があります。

私が使用したバッファは、buff と呼ばれるサイズ 35 バイトの char 配列/バッファであり、グローバル バッファです。バッファーの 8 番目のバイトは left_low と呼ばれ、4 バイトの値です。さて、私が C を理解している限り、演算子 '*' は 'Value At' 演算子です。バッファの 8 バイト目から 4 バイトをコピーするために、次のコードを記述しました。これは正しいです?または、ここで memcpy() を使用する必要がありますか? この場合、 memcpy() がどのように機能するかわかりません。助けてください!

char buff[35];
int write_function()  
{  
  struct calibration_data dcs2_config;  
  dcs2_config.left_low = *(buff+1*8); //will this work?  
  //or should this be done?  memcpy(&dcs2_config.left_low,buff+1*8,4);  

  return 0;  
}  
4

3 に答える 3

1

いいえ、うまくいきません。

の型はbuff+1*8ですchar*ので、 の型は*(buff+1*8)ですchar。したがって、dcs2_config.left_low = *(buff+1*8);単一文字の値をbuff+1*84文字に書き込みますleft_low(整数昇格を行います)。

あなたの最善の策は、おそらくmemcpyどちらにもしないことですが、ポインターをキャストすることです。であると仮定left_lowしますint:

dcs2_config.left_low = *((int *)(buff + 1*8));
于 2013-06-05T11:04:19.353 に答える
0

buff は char 配列であるため、コードは char (1 バイト) のみをコピーします。memcpy は期待どおりに動作します。

8、または sizeof(char)*8 と書くことができるのに、なぜ 1*8 と書くのかわかりません (ただし、sizeof(char) は常に 1 であることを思い出してください)。

于 2013-06-05T11:04:41.087 に答える
0

memcpy を使用する必要があります。コピーしようとしている方法では、1 バイト (文字の長さ) のみが選択されます。

于 2013-06-05T11:07:04.740 に答える