2026年3月5日の投稿[1件]
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言語
されど、今回の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言語