ページ 11

char型変数の先頭4byteにint型を入れたい

Posted: 2010年4月22日(木) 19:30
by KEI
こちらの質問・解答はいつも勉強させられています。
この度は一つ、質問をさせてください。

char型の変数の先頭4byteにint型のデータをいれたいのですが、
どうにも上手くいきません。

#define HEADER_SIZE 4

struct tPARA_DATA
{
int x;
int y;
};

char SendData[ sizeof( tPARA_DATA ) + HEADER_SIZE];
ZeroMemory(SendData, sizeof(SendData));
SendData[0] = 180;
memcpy( &SendData[HEADER_SIZE], (BYTE *)&pSend, sizeof( tPARA_DATA) );

このようにすると、先頭1byteにはデータがはいるのですが
のこり3byteがあまってしまいます。
また、1byteへint型4byteを入れようとすると、ERROR(C4305: '=' : '' から 'char' へ切り詰めます。)
とでて、数字がおかしなものになってしまいます。

どうにかうまく解決する方法はないでしょうか?

Re:char型変数の先頭4byteにint型を入れたい

Posted: 2010年4月22日(木) 20:21
by 組木紙織
やりたいことがよくわかってないのですが、
共用体をつかったらどうですか

Re:char型変数の先頭4byteにint型を入れたい

Posted: 2010年4月22日(木) 21:05
by たかぎ
(想像はつきますが)処理系が不明ですので、まともな回答はできません(あるいは非常に面倒です)。
望んでいる結果を得るには、境界調整やバイトオーダーに留意する必要があるからです。

Re:char型変数の先頭4byteにint型を入れたい

Posted: 2010年4月22日(木) 23:46
by lbfuvab
やりたいことが余りにも分かりません。
charが符号無しで、intのサイズを4で、リトルエンディアンで、構造体のパディングを0であり
pSend.x=1
pSend.y=2だったとします(順番もx,y)

するとSendDataはバイト的に考えて

| 180 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 2 | 0 | 0 | 0 |


のようになるのは分かりますか?

Re:char型変数の先頭4byteにint型を入れたい

Posted: 2010年4月23日(金) 12:49
by ookami
以下のようなことかと思いますが、みなさん仰っているように環境依存が心配です。
void main(void) {
char buf[4];
*((int*)&buf[0])=300;
printf("%d\n",*((int*)&buf[0]));
}

私ならですが、以下のような構造体にすると思います。的外れかもしれませんが。
struct hoge {
struct tPARA_DATA {
int x;
int y;
};
int header;
tPARA_DATA data;
};

Re:char型変数の先頭4byteにint型を入れたい

Posted: 2010年4月23日(金) 16:26
by たかぎ
int型が4バイトだとわかっているのであれば、境界調整やバイトオーダーに関係なく、次のようにすれば何とかなります。

int t = 180;
memcpy(&SendData[0], &t, 4);

もちろんint型が4バイトとは限りませんし、下位ビットだけを転送するというのであればバイトオーダーが重要になってきます。