2016-07-02 3 views
-3

Я хочу знать, можем ли мы memcpy структуру, содержащую 2 float-переменные, в другую структуру, содержащую 2 переменную int. Это то, что я до сих пор знаюmemcpy ing float to int

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

Integer и с плавающей точкой имеет различное внутреннее представление, а тетср просто побитовое копирование, так что если вы ожидали цифры, которые будут преобразованы в каком-то мере это не будет происходить.

Вместо этого вам нужно сделать это самостоятельно, например, объявив конструктор или функцию или оператор присваивания, который позволяет назначать stfloats для ограничения. Это также позволяет вам явно указывать требуемое преобразование.

В общем, неплохо использовать memcpy (между прочим, потому что он работает только для POD, а также потому, что вы получаете такую ​​проблему). Это C-элемент, которого следует избегать на C++.

+0

@Gujit Я не хочу отдельно копировать каждое поле в переменную struct. Так есть ли другой способ, где я могу напрямую копировать все данные в одной строке. – Harry

+1

@ Харри: Нет, как говорится в этом ответе. –

+1

Если вы добавите оператор-ассистент, вы можете использовать его для копирования всех данных в одной строке в любом месте. Вам просто нужно потратить три (более или менее) дополнительные строки, определяющие этот оператор присваивания. –

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++, нет. Лучше избегать этого в С тоже (в котором это неоднозначно) по этой причине. –