データ通信関連のソースを組んでいます。
その際にunionを使用したのですが、どうしても3バイトずれてしまいます。
API32
アライメントしてもVS2013の仕様なのか自分が間違っているのかわかりませんが、やはり3バイトずれてしまいます。
以下コードです。
unionについて
Re: unionについて
そもそもintとcharを比較していたら一致しないと思うのですが。
「アライメントしても」の意味も分かりません。ずれていない場合にどういう結果を期待しているのでしょうか。
「アライメントしても」の意味も分かりません。ずれていない場合にどういう結果を期待しているのでしょうか。
Re: unionについて
すみません。説明不足でした。
receive関数で、サーバーからデータが
char型 int型 PlayerParameter型が送られてくるのでそれをbuffer[256]に入っていると仮定します。
この時、10 0 プレイヤーのデータ(位置情報や向き)を取得してきます。
結果はbuffer[0]に10,buffer[1]に0,buffer[5]にプレイヤーのデータがはいっています。
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...のような)
拙い文章ですがどうかよろしくお願いいたします。
receive関数で、サーバーからデータが
char型 int型 PlayerParameter型が送られてくるのでそれをbuffer[256]に入っていると仮定します。
この時、10 0 プレイヤーのデータ(位置情報や向き)を取得してきます。
結果はbuffer[0]に10,buffer[1]に0,buffer[5]にプレイヤーのデータがはいっています。
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について
3byteずれるのは単純にアラインメントの問題だと思いますが。
Re: unionについて
VS2013での動作は確認していませんが、おそらくデフォルト4バイトでアライメントされています。
一般的に、外部と構造体データをやりとりする場合は、#pragma pack(1)にて明示的にアライメント指定(パディングをなくす)べきです。
詳細は以下など参考にしてください。
ロベールのC++教室 - 第14章 前へならえ -
一般的に、外部と構造体データをやりとりする場合は、#pragma pack(1)にて明示的にアライメント指定(パディングをなくす)べきです。
詳細は以下など参考にしてください。
ロベールのC++教室 - 第14章 前へならえ -
Re: unionについて
can110 さんが書きました:VS2013での動作は確認していませんが、おそらくデフォルト4バイトでアライメントされています。
一般的に、外部と構造体データをやりとりする場合は、#pragma pack(1)にて明示的にアライメント指定(パディングをなくす)べきです。
詳細は以下など参考にしてください。
ロベールのC++教室 - 第14章 前へならえ -
有難うございます。一度こちらをみてやってみたいと思います。