2016-07-02 18 views
-3

2つの浮動変数を含む構造体を2つのint変数を含む別の構造体にmemcpyできるかどうかを知りたいと思います。これは私がこれまでに持っていたものですmemcpy ing float into

struct stFloat 
{ 
float a; 
float b; 
}; 


struct stInt 
{ 
int a; 
int b; 
}; 


int main() 
{ 
struct stFloat aa; 
aa.a=12.234; 
aa.b=673.797; 

struct stInt bb; 

memcpy(&bb,&aa,sizeof(stFloat)); 

printf("%d %d\n",bb.a,bb.b); 

return 0; 
} 

残念ながら、私は望みの結果を得ていません。私が期待していた出力はですが、出力はごみのように見えます。誰かが私にこの問題の解決を手伝ってもらえますか?

おかげ

+1

その結果を期待していたのはなぜですか? –

+0

@Oliver整数部分だけがコピーされると思いました。 – Harry

+1

'a = b;'は 'memcpy(&a、&b、...);'と同じではありません。 –

答えて

3

整数と浮動小数点数は、異なる内部表現を持っている、とのmemcpyは、単にあなたが起こることはないだろういくつかの方法で変換する数字を期待しているかのように、ビット単位のコピーです。

代わりにstfloatsをスティントに割り当てることができるコンストラクタまたは関数または代入演算子を宣言するなどして、自分で行う必要があります。これにより、必要な変換を明示的に指定することもできます。

一般に、memcpyを使用することは悪い考えです(とりわけ、PODだけで動作するため、またこの種の問題が発生するため)。それはC++で避けなければならないCのことです。

+0

@Gujit私は個別に各フィールドを構造体変数にコピーしたくありません。だから私は1つの行にすべてのデータを直接コピーすることができる他の方法があります。 – Harry

+1

@ハリー:いいえ、この答えは言うとおりです。 –

+1

アサイグメント演算子を追加すると、それを使ってすべてのデータを好きな場所の1行にコピーできます。その代入演算子を定義する3行(多かれ少なかれ)の追加行を費やすだけで済みます。 –

1

いいえ、あなたはできませんが、あなたはあなたのためにそれを行います機能書くことができます(そうでなければのみ動作しますポインタ参照して、構造体を渡すことによって、それを呼び出す、そして

void cpy(struct stFloat *src, struct stInt *dest){ 
dest->a = (int)src->a; 
dest->b = (int)src->b; 
} 

を構造のコピーに):

struct stFloat f; 
struct stFloat i; 

cpy(&f,&i); 
+0

これらは参考書ではなくポインタです。 –

+0

@LightnessRacesinOrbit:関数の本体ではyesですが、&を引数として渡すときは正しい用語ではありません。 –

+0

C++ではありません。そのような理由からC言語でも避けるのがベストです(あいまいです)。 –