🗐 電装工芸日記 - 舞台照明機器の製作とか -

今年は開発案件を進めたい

or 管理画面へ

No.1202

Icon of admin
 C言語の共用体(union)ですが、教科書やら動画を見ますと「あまり使い道が無い」的な解説が多いような気がします。
 されど、今回のArt-Net系の装置では便利です。Art-Net のポート番号 0x1936(6454) の受信値をとりあえず突っ込んでおけばいいからです。例えば ArtDMX は530バイトのパケットですが、受信値を uint8_t[530] (または unsigned char[530]) の配列として保存するだけで ArtDMX の構造体としても扱えます。パディングに注意は必要ですが、便利に使えると思うのです。ID、OpCode、ProVer をまとめて評価するのに先頭12バイトを uint8_t[12] としておいて memcmp で判別することも出来ます。AertDMX と別種の Art-Net パケットもシームレスに扱えそうです。
 天才を超越した神たちが何故 union を作ったのかを考えるとワクワクします。

 とまぁ、最近C言語の理解が進んで一人笑いが止まらないアホの戯言でした。

 オレメモです。
 gccで構造体のパディングを回避する書き方。
 struct に続いて「__attribute__((__packed__))」を入れるそうな。

typedef struct __attribute__((__packed__)) {
 uint8_t ad_ID[8];
 uint8_t ad_OpCode[2];
 uint8_t ad_ProVerHi;
 uint8_t ad_ProVerLow;
 uint8_t ad_Sequence;
 uint8_t ad_Physical;
 uint8_t ad_SubUni;
 uint8_t ad_Net;
 uint8_t ad_LengthHi;
 uint8_t ad_Length;
 uint8_t ad_Data[512];
} artdmx;


 ArtDMXの構造体ならこんな感じに書けばよいのでしょう。たぶん。
 コンパイラによって書き方が違うこともあるそうな。
 この型を sizeof で見て530バイトならヨシです。

#C言語

■思ってみた

春が近づいてきた感じがします。

編集

■複合検索:

  • 投稿者名:
  • 投稿年月:
  • #タグ:
  • カテゴリ:
  • 出力順序:

■日付検索:

■カレンダー:

2026年3月
1234567
891011121314
15161718192021
22232425262728
293031

■カテゴリ:

■最近の投稿:

最終更新日時:
2026年3月5日(木) 14時56分58秒