Вопрос № 181807: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующиt вопросы: 1. Почему при компиляции в VS 2005 программы простого окна на строку return(lpMsg.wParam); появляется предупреждение: source01.cpp(54) : warning C4244: 'return' ...
Вопрос № 181807:
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующиt вопросы: 1. Почему при компиляции в VS 2005 программы простого окна на строку return(lpMsg.wParam); появляется предупреждение: source01.cpp(54) : warning C4244: 'return' : conversion from 'WPARAM' to 'int', possible loss of data. 2. Нужны ли скобки в return(lpMsg.wParam); я чаще встречал написание без скобок, хотя, что со скобками, что без скобок, всё равно появляется предупреждение. 3. И обязательно ли прописывать
то, что в скобках в функции hWnd=CreateWindow(..., (HWND)NULL, (HMENU)NULL, (HINSTANCE)hInstance, (HINSTANCE)NULL); Опять же, чаще встречал написание hWnd = CreateWindow(..., NULL, NULL, hInst, NULL); без (HWND), (HMENU), (HINSTANCE) 4. Программа компилируется и запускается, но после закрытия программы, окно закрывается, но программа находится в процессах, т.е. не перестаёт работать, может, это из-за предупреждения или код неправильно написан?
Отвечает Павел Юрьевич (8-й класс) :
Здравствуйте, Adsorores!
1. Ставьте в конце программы return(0) и не мучайтесь. 2. Можно и без скобок. 3. Явное преобразование NULL к определенным типам данных необязательно (это чисто для наглядности). 4. Должна пропадать из процессов. Проверьте с измененным return.
Ответ отправил: Павел Юрьевич (8-й класс)
Ответ отправлен: 10.01.2011, 08:35
Номер ответа: 265316 Россия, Челябинск ICQ # 197232777
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 265316
на номер 1151 (Россия) |
Еще номера »
Отвечает Сергей (2-й класс) :
Здравствуйте, Adsorores!
1. По-видимому, вы собираете 64-битное приложение. В 32-битном окружении WPARAM имеет тип unsigned int, в то время, как в 64-битном уже unsigned __int64. Разумеется, восемь байт (__int64) ну никак не поместится в четыре байта (int) без потери остальных четырёх байтов. А ведь возможно, что в них содержалось что-то очень важное, без чего мы жить не сможем, о чём и выражает своё беспокойство компиллятор (possible loss of data). В вашем случае это не страшно, достаточно успокоить
его явным приведением WPARAM к int: return (int) lpMsg.wParam;
2. Наличие скобок в данном случае ни на что не влияет.
3. Не обязательно.
4. Цикл while GetMessage прерывается, когда из очереди сообщений произойдёт выборка WM_QUIT. У вас она никогда не произойдёт потому, как вы установили фильтр "сообщения для окна hWnd": while (GetMessage(&lpMsg, hWnd, 0, 0)) { В то время, как WM_QUIT посылается не какому-то конкретному окну, а
всему приложению в целом (если точнее, то треду, но у вас он всего один). Чтобы всё-таки отловить его, можно поступить например так: while (GetMessage(&lpMsg, NULL, 0, 0)) {
Ответ отправил: Сергей (2-й класс)
Ответ отправлен: 10.01.2011, 20:19
Номер ответа: 265333 Россия, Мурманск
Оценка ответа: 5
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 265333
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.