(1)で受け取った構造体のメンバのデータを
(2)の構造体のメンバにコピーしたいと考えています。
(1)
typedef struct _recvData{
int data01;
int data02;
char data03;
char data 04;
char data05;
char data 06;
char data07;
char data08;
char data09;
char data10;
char array01[16];
char array02[16];
} recvData;
(2)
typedef struct _sendData{
int header;
int data01;
int data02;
char data03;
char data 04;
char data05;
char data 06;
char data07;
char data08;
char data09;
char data10;
int array01[4];
int array02[4];
} sendData;
そこで2点ほどおしえていただきたく、お願い致します。
(1)構造体が微妙に異なるため、各メンバ変数に値をそれぞれ代入していくしか方法がないのでしょうか?
(2)array01, array02はデータの型が異なる場合、データのコピーはどのようにしたらよいでしょうか?
No.5ベストアンサー
- 回答日時:
>(1)構造体が微妙に異なるため、各メンバ変数に値をそれぞれ代入していくしか方法がないのでしょうか?
struct _recvData rData;
struct _sendData sData;
として
memcpy(&sData.data01, &rData, sizeof(rData));
という連続したメモリー領域としてコピーが可能です。
C言語では、
構造体のアドレスはその先頭のメンバーのアドレスと一致する
ということが保障されています。
この手法には副作用があります。
■ 利点
プログラムメモリの消費量が小さくなる。
■ 欠点
送受信データの構造体の定義が反映されないため、
構造体のメンバーが変更されるとバグが発生する確率が高くなる。
構造体に個別の変数を代入方法は
マクロと関数にする方法がありますが
どちらが良いかは固有の問題ではなく、一般論です。
>(2)array01, array02はデータの型が異なる場合、データのコピーはどのようにしたらよいでしょうか?
エンディアン (endianness)が異なる場合
バイト列を並べ替える必要があります。
例
for (u_char *s = (u_char *)&sData.array01[0], int i = sizeof(sData.array01[0])/sizeof(rData.array01[0]) - 1; i >= 0 ; i--)
*s++ = (u_char)rData.array01[i];
エンディアンが等しい場合は、
他の回答にもあるように、そのままバイト列としてコピーすれば良いでしょう。
エンディアンの変換が必要である場合、
通信プロトコルのレイヤーが何処にあるかで
変換するかしないかを決定します。
アプリケーションのレイヤーでの互換性を維持する場合は、アプリケーションで
それより下位の通信プロトコルの場合には
その階層に一致するドライバーで変換するべきです。
No.4
- 回答日時:
同変数名のデータをコピー。
headerは対応する変数ないので未処理。
int型は4バイト。
を前提条件として、
data1~data10までは、
memcpy()で&_recvDataを&_sendData.data01へ16バイト分コピーでOKです。
array01,array02については、どういう変換をするかという
仕様次第ではありますが、例えば
char array01[4]=0x12, 0x34, 0x56, 0x78
というデータを
int array01[0]=0x12345678
というように代入したいとすれば、
int array01[0]=(0x78>>24)+(0x56>>16)+(0x34>>8)+0x12
でいけると思います^^
※もし、処理系がビックエンディアンなら、
memcpy()するサイズを48バイト分コピーでいけると思います!
No.3
- 回答日時:
つ「共用体」
headerが足りない分以外は基本的に同じサイズっぽい(パディング注意)ので、recvDataの先頭にintのダミーメンバー突っ込んでしまえば一応なんとかなりそう。
No.2
- 回答日時:
「構造体が微妙に異なる」というか, そもそもタグが違うから別物. よって「メンバごとちまちま代入する」しかない.
特殊な条件がそろえば memcpy とかが使える場面もないわけではないが, それを考えるくらいなら「微妙に異なる」ところ以外をまとめて構造体にしてしまえ.
No.1
- 回答日時:
>(1)構造体が微妙に異なるため、各メンバ変数に値をそれぞれ代入していくしか方法がないのでしょうか?
おそらく、そうせざるを得ないと思います。
>(2)array01, array02はデータの型が異なる場合、データのコピーはどのようにしたらよいでしょうか?
入力データがどうなっているときに、出力データをどうしたいかによると思います。
エンディアンが関係するかもしれません。
ところで、data03~data10は、配列にするわけにはいかないのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
C++言語で、構造体のコピーは可能(しても良い)のでしょうか?
C言語・C++・C#
-
構造体のデータを丸ごとコピーしたい
C言語・C++・C#
-
関数から配列を返すには?
C言語・C++・C#
-
-
4
構造体のメンバをfor文で回したい
C言語・C++・C#
-
5
C++ 構造体の一括初期化 {0}
C言語・C++・C#
-
6
int型の内容をbyteの配列にコピー
Java
-
7
C#で構造体の配列を持った構造体を使いたいのですが
C言語・C++・C#
-
8
C++にてtemplateで受け取った任意の型の変数が何型であるかを判定したい
C言語・C++・C#
-
9
C言語でのconstを返す関数
C言語・C++・C#
-
10
ファイル書込みで一行もしくは部分的に上書きする
PHP
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
-
long型のデータをバイト型の配...
-
構造体のデータを丸ごとコピー...
-
charとucharの違い
-
C++ 構造体の一括初期化 {0}
-
VBAにてcolorindexを変数に格納...
-
命名規則 VB 構造体
-
構造体を型の異なる構造体に代入
-
構造体のポインタにNULLが入らない
-
日付チェック関数について
-
値が代入されてない時
-
typedefをプログラム中で解除す...
-
C言語のキャストについて
-
変数の一括代入
-
整数から16進数への変換 現在c...
-
ユーザー定義型変数の一括初期化
-
C言語 構造体の中に共用体を定...
-
charで宣言した変数をstringへ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
C++ 構造体の一括初期化 {0}
-
構造体のデータを丸ごとコピー...
-
C言語 構造体の中に共用体を定...
-
「#undef」と「#define」の使い...
-
VBAにてcolorindexを変数に格納...
-
long型のデータをバイト型の配...
-
値が代入されてない時
-
異なる構造体のデータのコピー
-
構造体のポインタにNULLが入らない
-
VBAの変数のデータ型を変更する...
-
変数の初期化について
-
構造体の初期化方法について
-
ユーザー定義型変数の一括初期化
-
FILE構造体がどのように定...
-
charとucharの違い
-
typedefをプログラム中で解除す...
-
整数から16進数への変換 現在c...
-
VB.NETのStructureというのはど...
おすすめ情報