2016-07-02 9 views
-3

2 개의 float 변수를 포함하는 구조체를 2 개의 int 변수를 포함하는 다른 구조체에 memcpy 할 수 있는지 여부를 알고 싶습니다. 이것은 내가 지금까지 가지고있는 것이다.int float float float

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

정수 및 부동 소수점 다른 내부 표현이 있고, 방어 적이기는 단순히 당신이 일어나지 않을 것 어떤 방법으로 변환 할 수있는 숫자를 기대하고 있었다 그래서 만약 비트 단위 복사본입니다.

대신 stfloats를 stint에 할당 할 수있는 생성자 또는 함수 또는 할당 연산자를 선언하여 직접 처리해야합니다. 또한 원하는 변환을 명시 적으로 지정할 수 있습니다.

일반적으로 memcpy를 사용하는 것은 좋지 않습니다 (다른 것들 중에서도 POD에서만 작동하기 때문에 이런 종류의 문제가 발생하기 때문에). 그것은 C++에서 피해야 할 C의 것입니다.

+0

@Gujit 개별 필드를 struct 변수에 개별적으로 복사하고 싶지는 않습니다. 그래서 모든 데이터를 한 줄로 직접 복사 할 수있는 다른 방법이 있습니다. – Harry

+1

@Harry : 아니요,이 답변에 나와 있습니다. –

+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 : 함수의 본문에서는 예를 들어, &를 사용하여 인수 주소를 전달할 때 올바른 용어는 아닌가요? –

+0

C++에는 없습니다. 그 이유 때문에 C에서 그것을 피하는 것이 가장 좋습니다 (모호합니다). –

관련 문제