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

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

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

#1

投稿記事 by KEI » 15年前

こちらの質問・解答はいつも勉強させられています。
この度は一つ、質問をさせてください。

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型を入れたい

#2

投稿記事 by 組木紙織 » 15年前

やりたいことがよくわかってないのですが、
共用体をつかったらどうですか

たかぎ

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

#3

投稿記事 by たかぎ » 15年前

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

lbfuvab

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

#4

投稿記事 by lbfuvab » 15年前

やりたいことが余りにも分かりません。
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 |


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

ookami

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

#5

投稿記事 by ookami » 15年前

以下のようなことかと思いますが、みなさん仰っているように環境依存が心配です。
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型を入れたい

#6

投稿記事 by たかぎ » 15年前

int型が4バイトだとわかっているのであれば、境界調整やバイトオーダーに関係なく、次のようにすれば何とかなります。

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

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

閉鎖

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