異なる構造体のメンバにどのように変数ポイントを持たせることができますか?これは私がやろうとしていることですが、3行目は失敗します。構造体を別の構造体メンバにキャストする方法
volatile uint8_t tx_message_buffer[sizeof(MESSAGE)];
struct MESSAGE *tx_message = (MESSAGE *)tx_message_buffer;
struct PAYLOAD *tx_payload = (PAYLOAD *)tx_message->payload;
ここに構造体定義があります。
#define MSG_MAX_PAYLOAD_LENGTH 64
typedef struct PAYLOAD {
uint8_t descriptor;
uint8_t parameters[MSG_MAX_PAYLOAD_LENGTH-1];
};
typedef struct MESSAGE {
uint8_t address;
uint8_t length;
PAYLOAD payload;
uint8_t checksum;
};
サイドノート:これはシリアル化を行うには良い方法ではありません。アライメントや厳密なエイリアス違反の問題に簡単に取り組むことができます。すべての型が 'uint8_t'なのでこのコードでは起こりませんが、他の型を使うと問題が発生します。 (そして私はパディングとエンディアンの問題についてまだ言及していない)。 – user694733
@ user694733詳しいことはできますか?私は問題があるかもしれないことを知っています。配列を使用して、他のどのような種類の問題を引き起こすでしょうか? 1つのタイプのすべてのメッセージ要素を収集する方法について、より良い考えがありますか? – Oystein
基本的には、あるタイプのキャストポインタを使ってCの他のタイプのデータにアクセスすることはできません。これらのルールには例外がいくつかありますが、実際は地雷です。あなたは、コンパイラがハードウェア上で確実に動作しないコードを生成したり、誤ってコードを生成したりすることがないようにすることができます。バイトシフトとマスキングを使用し、結果をバイト配列に代入することで、各構造体メンバを手動でバイトに変換するのが正しい方法です(移植性と信頼性が最も高くなります)。 – user694733