Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2011, 16:45   #1
MaratZahidyl
Пользователь
 
Аватар для MaratZahidyl
 
Регистрация: 18.08.2011
Сообщений: 70
По умолчанию Visual C++ 2005 Expres не работает преобразование типов, выдает ошибку.

Здравствуйте! Подскажите пожалуйсто.

Когда например пишиш
float car=10;
int house=0;

house=car;
то компилятор выдает ошобку.
при явном приведении типа таже ошибка

интересно что из float в int не переводит, а наоборот все нормально
Может нужно в настройках компилятора чтото поменять

Последний раз редактировалось MaratZahidyl; 05.09.2011 в 16:49.
MaratZahidyl вне форума Ответить с цитированием
Старый 05.09.2011, 17:21   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

И где же ошибка? Куда вы ее спрятали?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 05.09.2011, 17:32   #3
MaratZahidyl
Пользователь
 
Аватар для MaratZahidyl
 
Регистрация: 18.08.2011
Сообщений: 70
По умолчанию

сегодня текст ошибки не могу предоставить, единственное что помню это то что ошибка одна, и указывает на функцию в которой поисходит это приведение типов, при двойном щелчке на ошибке к месту самой ошибки не переходит.
MaratZahidyl вне форума Ответить с цитированием
Старый 05.09.2011, 21:41   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Есть такие понятия как явное и неявное преобразование типов. Обычно неявные преобразования работают только в случае отсутствия потери данных (при преобразовании из int во float никакая информация не теряется. Грубо говоря, было 10, а стало 10.0). В случае же с преобразованием из float в int, теряется дробная часть (было 15,32, а стало 15) и поэтому данное преобразование выполняется только явно: house = (int) car;
Так же делайте и при разработке своих классов в будущем, т.к. в С++ неявные преобразования любят выполняться в самых неожиданных местах и, в случае потери данных при таких преобразованиях, будете долго искать ошибки.
pu4koff вне форума Ответить с цитированием
Старый 05.09.2011, 22:50   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> при преобразовании из int во float никакая информация не теряется

тут всё-равно нужно быть аккуратным, т.к. если int и float занимают по 4 байта, то одназначно представить любое значение int как float нельзя.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 05.09.2011, 22:59   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

причем тут размер в байтах?
вещественные числа иначе хранятся, потому обычный (int 32 бита который) вполне влазит.
а вообще лучше обычно double
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.09.2011, 11:56   #7
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

При любых преобразованиях int во float или наоборот будут потери !
У вещественных чисел 8 бит отводится под порядок, 23 бита под мантису, 1 бит под знак. Если число достаточно большое, то на самом деле теряется точность ! И происходит так называемое округление.
Цитата:
Сообщение от MaratZahidyl Посмотреть сообщение
интересно что из float в int не переводит, а наоборот все нормально
Может нужно в настройках компилятора чтото поменять
По этому при любом неявном преобразовании компилятор будет выдавать предупреждения:
warning C4244: =: преобразование "float" в "int", возможна потеря данных
warning C4244: =: преобразование "int" в "float", возможна потеря данных
An1ka вне форума Ответить с цитированием
Старый 06.09.2011, 12:06   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от An1ka Посмотреть сообщение
При любых преобразованиях int во float или наоборот будут потери !
Не так. При преобразовании из int во float возможна потеря точности и тогда вместо 1543 мы получим что-то вроде 1542.999999999999999.
Всё это укладывается в заложенную в тип float погрешность, которую нужно учитывать при использовании этого типа.
float так же плохо прибавляет к очень большому числу очень маленькое и там так же много интересного может быть, так что потери от преобразования из int в float - это вообще ничего.
Цитата:
Сообщение от An1ka Посмотреть сообщение
По этому при любом неявном преобразовании компилятор будет выдавать предупреждения:
warning C4244: =: преобразование "float" в "int", возможна потеря данных
warning C4244: =: преобразование "int" в "float", возможна потеря данных
На плюсах давно не писал, так что могу врать.
Получается, что я в своём первом посте был неправ и таки компилятор неявно даёт преобразовывать из float в int?
pu4koff вне форума Ответить с цитированием
Старый 06.09.2011, 12:21   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Получается, что я в своём первом посте был неправ и таки компилятор неявно даёт преобразовывать из float в int?
Код из 1 поста компилируется в 2010 (даже с error level 4) с 1 варнингом о возможной потери информации.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 06.09.2011, 15:01   #10
MaratZahidyl
Пользователь
 
Аватар для MaratZahidyl
 
Регистрация: 18.08.2011
Сообщений: 70
По умолчанию

Здравствейте!
как я говорил "ошибка одна, и указывает на функцию в которой поисходит это приведение типов"
Вот код ошибки:
error LNK2019: unresolved external symbol __ftol2_sse referenced in function "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)


если поставлю код преобразования в другую функцию - будет такая ошибка
error LNK2019: unresolved external symbol __ftol2_sse referenced in function "void __cdecl kamera(void)" (?kamera@@YAXXZ)

при явном приобразовании
float car=10;
int house=0;
house = static_cast<int>(car);
таже ошобка
MaratZahidyl вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему у моего друга не работает програма скомпилированная в Microsoft Visual C++ 2005 Express Edition ? pufystyj Visual C++ 16 09.02.2011 20:50
Преобразование типов jungle Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 04.12.2010 19:41
скрит работает в interbase а в FireBird выдает ошибку NikK1 БД в Delphi 9 13.04.2010 18:07
Выдает ошибку но работает.Что не так? Студло Помощь студентам 1 01.03.2010 09:12
Немогу понять,почему Microsoft Visual Studio 2005 (C++) выдает ошибки? FanEurovision Visual C++ 3 18.05.2009 20:06