CのMemcpy-forループで配列を使用してから構造体に割り当てる

アダム

forループを使用して、UARTRXバッファからメモリに配列をコピーしています。

これは次のようになります。

UART2_readTimeout(uartR2, rxBuf3, 54, NULL, 500);
GPIO_toggle(CONFIG_GPIO_LED_3);

if ((rxBuf3[4] == 0x8C) && (rxBuf3[10] != 0x8C)) {
    int i;
    for (i = 0; i < 47; i++) {
        sioR2[i]=rxBuf3[i];
    }

次にstruct、次のようなものを使用して、データを操作および整理するときにドット表記を使用できるようにします。

typedef struct
{
  uint16_t voltage;
  uint16_t current;
  uint16_t outTemp;
  uint16_t inTemp;
  uint16_t status;
  uint32_t FaultA;
  uint32_t FaultB;
  uint32_t FaultC;
  uint32_t FaultD;
  uint8_t softwareMode;
  uint8_t logicLoad;
  uint8_t outputBits;
  uint16_t powerOut;
  uint32_t runHours;
  uint16_t unitAddresses[6];
} unitValues;

これらの全長が同じであると仮定すると、memcpy構造体の単一のインスタンスに対して配列全体でを実行することは可能ですか?

Array  : 001110101....110001
         |||||||||||||||||||   <- memcpy
         vvvvvvvvvvvvvvvvvvv
Struct : 001110101....110001
ジョン・ボリンジャー

C実装が、構造のレイアウトが、問題のドライバーがバッファーの書き込みに使用するレイアウトと同じであることを確認する方法を提供する場合、これを実行するためのかなり良い方法は、ドライバーに直接書き込むことです。構造。ここでドライバー関数のシグネチャを推測していますが、おそらく次のようになります。

UART2_readTimeout(uartR2, (uint8_t *) &values, 54, NULL, 500);

それuint8_tがのエイリアスであるunsigned charか、おそらくcharあると仮定すると、タイプのポインタを介して構造体の表現に書き込むことが有効ですuint8_t *したがって、これにより、コピーを作成する必要がなくなります。

ただし、秘訣は構造のレイアウトです。データが指定された構造体メンバーとして指定された順序で、ギャップなしでレイアウトされることを期待すると、そのような構造体レイアウトは、すべてのメンバーがそれらの倍数であるアドレスに整列されるように構造体インスタンスがメモリに配置されるのを防ぎますサイズ。ハードウェアの配置ルールによっては、これで問題ない場合もありますが、一部のメンバーへのアクセスが遅くなるか、一部のメンバーにアクセスしようとするとプログラムがクラッシュする可能性があります。

それでも続行したい場合は、構造の必要なレイアウトを取得する方法について、コンパイラのドキュメントを確認する必要があります。構造体の「パッキング」、構造体のレイアウト、または構造体のメンバーの配置への参照を探す場合があります。これを行う標準的な方法はありません。C実装がそれをサポートしている場合、それは実装固有の詳細を含む拡張機能を構成します。

memcpyバッファの内容を構造タイプのインスタンスにコピーするために使用する場合にも、同じ問題と警告がすべて当てはまります。したがって、データの複数のコピーを作成せず、構造に一括コピーを作成するように手配できる場合は、次のようになります。別のバッファに書き込んでからコピーするよりも、構造体に直接書き込む方がよいでしょう。


一方、安全で標準的な代替策は、実装が最適と思われる方法で構造をレイアウトできるようにすることです。また、データをバッファからメンバーごとに構造にコピーします。メンバーmemcpy()の。はい、コードは少し面倒ですが、配置関連の問題や、構造体メンバーの並べ替えや新しいメンバーの追加にさえ敏感ではありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Cを使用して、データベースから構造体のポインタ変数の配列に文字列を割り当てて読み取る方法

Golang-ループごとに構造体の配列を割り当てます

他の関数から構造体配列にアクセスして値を割り当てる方法

Cの構造体(構造体の配列に値を割り当てる)

構造体の配列内に構造体の配列を割り当てる

すべてのメンバーに割り当てられたメモリを使用して、ヒープ上に構造体の配列を作成します

intの配列を含む構造体を構造体の配列に正しく割り当てるにはどうすればよいですか?

構造体を割り当てても、構造体内のchar配列がnullになるのはなぜですか?

構造体配列からフィールドを抽出して、別の構造体配列に配置します

構造体の配列内の構造体に文字列要素を割り当てる

mallocで構造体を割り当てる場合、メモリ上のどこに構造体フィールドが割り当てられますか?

Cの配列の構造体からデータを割り当ててアクセスする方法

Cでmalloc()を使用して構造体の配列を割り当てるにはどうすればよいですか?

Cでの構造体ポインタを使用した配列割り当て

同じタイプの構造体の配列の要素を構造体変数に割り当てることができないのはなぜですか?

Juliaで構造体の配列を作成して値を割り当てる

C動的に割り当てられた構造体配列を解放する

Cの構造体に含まれる構造体の配列に構造体はどのように割り当てられますか?

構造体のメンバー変数の1つを使用して、構造体内の配列の長さを割り当てることは機能しますか?

複数の構造体の配列を動的に割り当てる

Cでファイルから読み取るときに、ポインターを使用して構造体の配列を埋める方法

構造体で作られたベクトルに配列を割り当てる際の大きな問題はありますか?

構造体の配列でintポインタメンバーを初期化して動的に割り当てるにはどうすればよいですか?

構造体の配列を動的に割り当てる

これは、構造体の一部である動的に割り当てられた複数の配列を解放する正しい方法ですか?

C構造体応答で配列を動的に割り当てますか?

構造体での配列割り当て

Cで構造体へのポインタの配列を宣言しますが、必要になるまで構造体にメモリを割り当てません

Cのヒープに構造体を割り当てる

TOP 一覧

  1. 1

    どのように関係なく、それがどのように「悪い」、すべてのSSL証明書でのHttpClientを使用しないように

  2. 2

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  3. 3

    Modbus Python Schneider PM5300

  4. 4

    System.Data.OracleClient.OracleException:ORA-06550:行1、列7:

  5. 5

    scala.xmlノードを正しく比較する方法は?

  6. 6

    インデックス作成時のドキュメントの順序は、Elasticsearchの検索パフォーマンスを向上させますか?

  7. 7

    Elasticsearch - あいまい検索は、提案を与えていません

  8. 8

    グラフ(.PNG)ファイルをエクスポートするZabbix

  9. 9

    Ansibleで複数行のシェルスクリプトを実行する方法

  10. 10

    変数値を含むElasticSearch検索結果

  11. 11

    Elasticsearchでサーバー操作を最適化:低いディスク透かしに対処する

  12. 12

    Python / SciPyのピーク検出アルゴリズム

  13. 13

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  14. 14

    テキストフィールドの値に基づいて UIslider を移動します

  15. 15

    Chromeウェブアプリのウェブビューの高さの問題

  16. 16

    NGX-ブートストラップ:ドロップダウンに選択したアイテムが表示されない

  17. 17

    Reactでclsxを使用する方法

  18. 18

    STSでループプロセス「クラスパス通知の送信」のループを停止する方法

  19. 19

    Pushwooshで削除されたアプリデバイストークンを処理する方法は?

  20. 20

    ラベルとエントリがpythontkinterに表示されないのはなぜですか?

  21. 21

    Elasticsearchの場合、間隔を空けた単語を使用したワイルドカード検索

ホットタグ

アーカイブ