構造体とバイト配列の変換

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
やまっち
記事: 20
登録日時: 10年前

構造体とバイト配列の変換

#1

投稿記事 by やまっち » 10年前

いつもお世話になっております。
bcc55 + Windows で C 言語の勉強をしている者です。

構造体 と バイト配列で変換ができないかどうか
教えて頂きたいです。
以下のようなコードで一括で配列から構造体に
データを格納したいのですが、スマートなやり方は
ありませんでしょうか?

コード:

#include <stdio.h>

// 10,"test" を 20,"TEST" に

typedef struct
{
	char x; // 8 bit (int は 32 bit)
	char c[5]; // 8 bit
}hoge_t;

void main()
{
	hoge_t hoge;
	char s[]="test";
	int i;
	char value[]={20,0x54,0x45,0x53,0x54}; // 20,"TEST"
	// hoge の初期化 ("test", 10 を入れる)
	for(i=0;i<sizeof(s);i++) hoge.c[i]=s[i];
	hoge.x=10;
	// 表示
	printf("%d ", hoge.x);
	printf("%s", hoge.c);
	printf("\n");

	// for(i=0;i<sizeof(value);i++) hoge[i]=value[i]; // こう言う具合に代入したかったが以下のエラーが発生
		// エラー E2110 test.c 24: 互換でない型変換(関数 main )
		// エラー E2062 test.c 24: 無効な間接参照(関数 main )
	// 上記のように一括で代入できないので、以下のように2行で代入する
	hoge.x=value[0];
	for(i=1;i<sizeof(value);i++) hoge.c[i-1]=value[i];
	// 表示
	printf("%d ", hoge.x);
	printf("%s", hoge.c);
	printf("\n");

}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 構造体とバイト配列の変換

#2

投稿記事 by みけCAT » 10年前

規格上は未定義(環境依存)になりそうな気がします(確認はしていない)が、memcpyを使ってみてはいかがでしょうか?

コード:

#include <stdio.h>
#include <string.h>

// 10,"test" を 20,"TEST" に

typedef struct
{
	char x; // 8 bit (int は 32 bit)
	char c[5]; // 8 bit
}hoge_t;

void main()
{
	hoge_t hoge;
	char s[]="test";
	int i;
	char value[]={20,0x54,0x45,0x53,0x54}; // 20,"TEST"
	// hoge の初期化 ("test", 10 を入れる)
	for(i=0;i<sizeof(s);i++) hoge.c[i]=s[i];
	hoge.x=10;
	// 表示
	printf("%d ", hoge.x);
	printf("%s", hoge.c);
	printf("\n");

	// for(i=0;i<sizeof(value);i++) hoge[i]=value[i]; // こう言う具合に代入したかったが以下のエラーが発生
		// エラー E2110 test.c 24: 互換でない型変換(関数 main )
		// エラー E2062 test.c 24: 無効な間接参照(関数 main )
	// 上記のように一括で代入できないので、以下のように2行で代入する
	//hoge.x=value[0];
	//for(i=1;i<sizeof(value);i++) hoge.c[i-1]=value[i];

	memcpy(&hoge, value, sizeof(value));

	// 表示
	printf("%d ", hoge.x);
	printf("%s", hoge.c);
	printf("\n");

}
Ideone.comで動作確認
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 構造体とバイト配列の変換

#3

投稿記事 by usao » 10年前

共用体を使うとか…?

コード:

struct Bytes6
{	char Bytes[6];	};

union U
{
	struct
	{
		char x;
		char c[5];
	} hoge_t;

	Bytes6 Bytes;
};

//
int main( void )
{
	U u = { 'H', "ello" };
	printf( "%s\n", u.Bytes.Bytes );

	Bytes6 bytes = { "World" };
	u.Bytes = bytes;  //構造体同士なら=で代入できる
	printf( "%s\n", u.Bytes.Bytes );

	//
	return 0;
}
(アライメントの話とか考えないとダメかもしれない)

かずま

Re: 構造体とバイト配列の変換

#4

投稿記事 by かずま » 10年前

キャストを使うのはいかかでしょうか?

コード:

#include <stdio.h>
 
typedef struct {
    char x;
    char c[5];
} hoge_t;
 
int main(void)
{
    hoge_t hoge;
    char value[6] = { 20, 'T', 'E', 'S', 'T' };
    hoge = *(hoge_t*)value;     // キャストして、構造体の代入
    printf("%d %s\n", hoge.x, hoge.c);
    return 0; 
}

やまっち
記事: 20
登録日時: 10年前

Re: 構造体とバイト配列の変換

#5

投稿記事 by やまっち » 10年前

いつもお世話になっております。
いくつかの方法を教えて頂いてありがとうございました。
勉強になります。

・みけCAT さん (memcpy を使う方法)
・かずま さん (キャストを使う方法)
の2つは動作確認ができました。
うまく使わせて頂きたいと思います。
キャストを使う方法はすごくスマートそうですね。

・usao さん (共用体を使う方法)

エラー E2139 test.c 12: 宣言に ; がない
など、いくつかのエラーが出て動作確認ができませんでした。
ただ共用体 union と言うのは知らなかったので勉強に
なりました。

ありがとうございました。

やまっち
記事: 20
登録日時: 10年前

Re: 構造体とバイト配列の変換

#6

投稿記事 by やまっち » 10年前

すみません、解決にチェックし忘れました。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 構造体とバイト配列の変換

#7

投稿記事 by usao » 10年前

>いくつかのエラーが出て動作確認ができませんでした。

structまわりの書き方をCな書き方に直してください.
構造体型の変数の定義の際に先頭に struct を付すか,あるいは

(C++) struct XXX {}; → (C) typdef struct XXX {} XXX;

としておくとか.

やまっち
記事: 20
登録日時: 10年前

Re: 構造体とバイト配列の変換

#8

投稿記事 by やまっち » 10年前

> (C++) struct XXX {}; → (C) typdef struct XXX {} XXX;

usao さんに教えていただいた方法で確認ができました。
typedef が必要だったのですね。
教えて頂いてありがとうございました。

閉鎖

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