C:[]

2017-02-06 7 views
2

をuint8_tへのポインタといくつかのトラブルを抱えて、私はマイクロコントローラで働いていると、作業のコードを以下ました:C:[]

.hファイルを

const static uint8_t state0[] = "Off"; 
const static uint8_t state1[] = "ROMLoad"; 
const static uint8_t state2[] = "RAMLoad"; 
const static uint8_t state3[] = "PacketSend"; 
const static uint8_t state4[] = "Process"; 

の.cファイル

 switch (coapapp_vars.state) { 
     case 0: 
      packetfunctions_reserveHeaderSize(msg, sizeof(state0) - 1); 
      memcpy(&msg->payload[0], &state0, sizeof(state0) - 1); 
      break; 
     case 1: 
      packetfunctions_reserveHeaderSize(msg, sizeof(state1) - 1); 
      memcpy(&msg->payload[0], &state1, sizeof(state1) - 1); 
      break; 
     case 2: 
      packetfunctions_reserveHeaderSize(msg, sizeof(state2) - 1); 
      memcpy(&msg->payload[0], &state2, sizeof(state2) - 1); 
      break; 
     case 3: 
      packetfunctions_reserveHeaderSize(msg, sizeof(state3) - 1); 
      memcpy(&msg->payload[0], &state3, sizeof(state3) - 1); 
      break; 
     case 4: 
      packetfunctions_reserveHeaderSize(msg, sizeof(state4) - 1); 
      memcpy(&msg->payload[0], &state4, sizeof(state4) - 1); 
      break; 
     } 

私はスイッチの後にmemcpyを呼び出すことによってファイルを短くする(コードのアップロードが少ない)ようにこのコードを変更したいと思います。そのため、ポインタを埋めるためにケースを使って.hから正しい値を指すポインタを使う必要があります。 残念ながら、私はそれを動作させることができませんでした。だから私は*または&を使用する必要があるところでは、まったく無名です。私はいろいろな方法を試しましたが、どれも成功しませんでした。

質問は次のとおりです。char配列の1つを指す変数を初期化するために使用するuint8_t(uint8_t/uint8_t */uint8_t **)のタイプは何ですか? (ポインタ)変数(ptr = state/ptr = &状態/ ptr = &状態[0]/...)を入力するにはどうすればよいですか? memcpy関数(ptr/& ptr/* ptr/&(* ptr)/ ...)で変数(ポインタ)を使用する必要はありますか?

私はサイズのために自分自身を設定した変数を使う必要があることを知っています。

さらに詳しい情報:このコードはOpenWSNで使用されています。私はIoTデバイス/マイクロコントローラで作業しています。私は彼らのCOAP実装を使って情報をブラウザに送ります。

編集:スイッチの後にreserveHeaderSize関数とmemcpy関数の両方が配置されます。 正解で指摘したように、これはかなりシンプルですが、私は自分の小さな愚かなエラーを見落とし続けました。私は基本的にsizeof(サイズ)を行っていたので、第3引数でsizeofを削除しませんでした。 Derp

+0

「const static」は廃止されていることにご注意ください。 Cは 'static const'を代わりに使用します。また、元のリテラルを直接使用するのではなく、元のリテラルの複数のコピー(各翻訳単位で別々のセット)を持つことを主張する理由は、すぐには分かりません。 'sizeof'を使えるようにするには? – AnT

答えて

2

あなたが正しく理解していれば、caseにポインタ変数を割り当てて、後でmemcpy()を呼び出すことができます。そうなら、それは簡単です。それぞれの場合にコピーするサイズを設定するだけで済みますが、すでにそれを述べています。それはどのようになるのです

uint8_t *stateptr; // pointers can be assigned to arrays 
    size_t size; 

    switch (coapapp_vars.state) { 
    case 0: 
     packetfunctions_reserveHeaderSize(msg, sizeof(state0) - 1); 
     stateptr = state0; 
     size = sizeof state0; 
     break; 
    case 1: 
     packetfunctions_reserveHeaderSize(msg, sizeof(state1) - 1); 
     stateptr = state1; 
     size = sizeof state1; 
     break; 
    // other cases 
    } 
    memcpy(&msg->payload[0], stateptr, size-1); 

は、あなたのコード内であなたも

memcpy(&msg->payload[0], state0, sizeof state0 - 1); 

の代わり..., &state0, ...を書かれている可能性がありますのでご注意ください。

+0

実際には単純です...私は以前これを試していましたが、私が見落とした1つの愚かなミスのために動作しませんでした...私はmemcpyにsizeof()を残しておき、状態変数をsize変数、基本的にsizeof(size)を書くことは明らかに間違っています。 この質問は実際には現在廃止されていますが、私はたくさんのことに感謝したいと思います!あなたのコードを読まなければ、私はその小さなエラーを見過ごしてしまいます。だからもう一度、多くの感謝! 私たちが間違っている何かを探している間は、明らかに明白な隠れ場所に隠れている小さな愚かなものです。 – Whitekang

+0

私は確かにそれを知っています:-)嬉しいことに私は助けました –