unionについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ヒララシ

unionについて

#1

投稿記事 by ヒララシ » 9年前

データ通信関連のソースを組んでいます。
その際にunionを使用したのですが、どうしても3バイトずれてしまいます。
API32
アライメントしてもVS2013の仕様なのか自分が間違っているのかわかりませんが、やはり3バイトずれてしまいます。
以下コードです。

コード:

union Data{
 char buffer[MAXBUFFER];
 struct{
  char com;
  int id;
  PlayerParameter pram;
 };
};

union Data d;
int Update{

 int rec = receive(&d, sizeof(Data));
 if( rec <= 0 ) return -1;
 if( d.id != d.buffer[1] ) //idとbuffer[1]が3バイトずれている
  printf("違うよ");
 else
  printf("一緒");

 return 0;
}

ヒララし

Re: unionについて

#2

投稿記事 by ヒララし » 9年前

書き忘れ追伸

ビットフィールドを試した所、その時はデータの受取でエラーが起きてしまいました。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: unionについて

#3

投稿記事 by h2so5 » 9年前

そもそもintとcharを比較していたら一致しないと思うのですが。
「アライメントしても」の意味も分かりません。ずれていない場合にどういう結果を期待しているのでしょうか。

ヒララシ

Re: unionについて

#4

投稿記事 by ヒララシ » 9年前

すみません。説明不足でした。
receive関数で、サーバーからデータが
char型 int型 PlayerParameter型が送られてくるのでそれをbuffer[256]に入っていると仮定します。
この時、10 0 プレイヤーのデータ(位置情報や向き)を取得してきます。
結果はbuffer[0]に10,buffer[1]に0,buffer[5]にプレイヤーのデータがはいっています。
buffer[5]は

コード:

PlayerParameter pp = (PlayerParameter*)&buffer[5];
のようにキャストしてPlayerParameterにセットするときちんとデータが入ります。
unionは上記データと共有しているはずなので
char comには10
int idには0
PlayerParameter paramにはプレイヤーデータがはいっていてほしいのですが、アドレス参照し、比較した所3バイトずれていて、
comには10(ここはあっている)
idには初期化されていない数(-16031837~みたいな)
PlayerParameterには最初3つに初期化されていない数、残りのデータに3つ分ずれたデータが入ってしまうと言う感じです。
(posはデタラメangleにposX,scaleXにposY...のような)

拙い文章ですがどうかよろしくお願いいたします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: unionについて

#5

投稿記事 by h2so5 » 9年前

3byteずれるのは単純にアラインメントの問題だと思いますが。

can110
記事: 27
登録日時: 9年前

Re: unionについて

#6

投稿記事 by can110 » 9年前

VS2013での動作は確認していませんが、おそらくデフォルト4バイトでアライメントされています。
一般的に、外部と構造体データをやりとりする場合は、#pragma pack(1)にて明示的にアライメント指定(パディングをなくす)べきです。

詳細は以下など参考にしてください。
ロベールのC++教室 - 第14章 前へならえ -

ヒララシ

Re: unionについて

#7

投稿記事 by ヒララシ » 9年前

h2so5 さんが書きました:3byteずれるのは単純にアラインメントの問題だと思いますが。
自分もおそらくそうだろうなと思ったので
いろいろ調べてみて

コード:

union{
 ~~
 struct __declspec(align8){
   ~~~
 };
};
を試してみたのですが、それでもうまく行きませんでした。

ヒララシ

Re: unionについて

#8

投稿記事 by ヒララシ » 9年前

can110 さんが書きました:VS2013での動作は確認していませんが、おそらくデフォルト4バイトでアライメントされています。
一般的に、外部と構造体データをやりとりする場合は、#pragma pack(1)にて明示的にアライメント指定(パディングをなくす)べきです。

詳細は以下など参考にしてください。
ロベールのC++教室 - 第14章 前へならえ -

有難うございます。一度こちらをみてやってみたいと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る