ページ 1 / 1
unionについて
Posted: 2015年1月16日(金) 15:37
by ヒララシ
データ通信関連のソースを組んでいます。
その際に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について
Posted: 2015年1月16日(金) 15:38
by ヒララし
書き忘れ追伸
ビットフィールドを試した所、その時はデータの受取でエラーが起きてしまいました。
Re: unionについて
Posted: 2015年1月16日(金) 17:21
by h2so5
そもそもintとcharを比較していたら一致しないと思うのですが。
「アライメントしても」の意味も分かりません。ずれていない場合にどういう結果を期待しているのでしょうか。
Re: unionについて
Posted: 2015年1月16日(金) 18:08
by ヒララシ
すみません。説明不足でした。
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...のような)
拙い文章ですがどうかよろしくお願いいたします。
Re: unionについて
Posted: 2015年1月16日(金) 18:19
by h2so5
3byteずれるのは単純にアラインメントの問題だと思いますが。
Re: unionについて
Posted: 2015年1月16日(金) 18:29
by can110
VS2013での動作は確認していませんが、おそらくデフォルト4バイトでアライメントされています。
一般的に、外部と構造体データをやりとりする場合は、#pragma pack(1)にて明示的にアライメント指定(パディングをなくす)べきです。
詳細は以下など参考にしてください。
ロベールのC++教室 - 第14章 前へならえ -
Re: unionについて
Posted: 2015年1月16日(金) 18:30
by ヒララシ
h2so5 さんが書きました:3byteずれるのは単純にアラインメントの問題だと思いますが。
自分もおそらくそうだろうなと思ったので
いろいろ調べてみて
コード:
union{
~~
struct __declspec(align8){
~~~
};
};
を試してみたのですが、それでもうまく行きませんでした。
Re: unionについて
Posted: 2015年1月16日(金) 18:33
by ヒララシ
can110 さんが書きました:VS2013での動作は確認していませんが、おそらくデフォルト4バイトでアライメントされています。
一般的に、外部と構造体データをやりとりする場合は、#pragma pack(1)にて明示的にアライメント指定(パディングをなくす)べきです。
詳細は以下など参考にしてください。
ロベールのC++教室 - 第14章 前へならえ -
有難うございます。一度こちらをみてやってみたいと思います。