Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 31.03.2017
Сообщений: 9

+=: преобразование "double" в "int"

11.04.2017, 17:29. Показов 1930. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как решить проблему
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <Windows.h>
#include <tchar.h>
#include <cmath>
#define M_PI           3.14159265358979323846  /* pi */
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
TCHAR WinName[] = _T("MainFrame") ;
int APIENTRY WinMain(HINSTANCE This, // Дескриптор текущего приложения
                     HINSTANCE,                   // В современных системах всегда 0
                     LPTSTR,                       // Командная строка
                     int mode)                         // Режим отображения окна
{
    HWND hWnd;              // Дескриптор главного окна программы
    MSG msg;                // Структура для хранения сообщения
    WNDCLASS wc;  // Класс окна
    // Определение класса окна
    wc.hInstance = This;
    wc.lpszClassName = WinName;                // Имя класса окна
    wc.lpfnWndProc = WndProc;                  // Функция окна
    wc.style = CS_HREDRAW | CS_VREDRAW;       // Стиль окна
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);    // Стандартная иконка
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Стандартный курсор
    wc.lpszMenuName = NULL;       // Нет меню
    wc.cbClsExtra = 0;            // Нет дополнительных данных класса
    wc.cbWndExtra = 0;            // Нет дополнительных данных окна
    // Заполнение окна белым цветом
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
    if (!RegisterClass(&wc)) return 0;   // Регистрация класса окна
    // Создание окна
    hWnd = CreateWindow(WinName, // Имя класса окна
        _T("Шарик"),  // Заголовок окна
        WS_OVERLAPPEDWINDOW,         // Стиль окна
        400, // x
        300, // y   Размеры окна
        400, // width
        300, // Height
        HWND_DESKTOP, // Дескриптор родительского окна
        NULL,         // Нет меню
        This,         // Дескриптор приложения
        NULL);        // Дополнительной информации нет
    ShowWindow(hWnd, mode); // Показать окно
    // Цикл обработки сообщений
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg); // Функция трансляции кодов нажатой клавиши
        DispatchMessage(&msg);  // Посылает сообщение функции WndProc()
    }
    return 0;
}
 
RECT rc;
int x,y,R; // Координаты места создания шарика т.с там где он появится в нашем окне 
double vx,vy,v,t;
LRESULT CALLBACK WndProc(HWND hWnd,UINT message, WPARAM wParam,LPARAM lParam)
{
    switch(message)
    {
    case WM_LBUTTONDOWN: // По нажатию левой кнопки мыши устанавливаем параметры и запускаем таймер который при значений NULL выполняет WM_TIMER 
        x  = LOWORD(lParam);// Сохраняем координаты курсора мыши (Ширина-высота)
        y  = HIWORD(lParam);// x;y - место появления шара т.е место куда мы щелкнули мышью это определяется параметрами LOWORD / HIWORD
        R=15;// R - Радиус (Размер)
        v=7.0; // Скорость
        t=(rand()%360-180)*M_PI/180.0;// случайный угол в радианах
        vx=v*cos(t); 
        vy=v*sin(t);// vx ; vy - скорость шарика под углом
 
        SetTimer(hWnd,1,25,NULL);
        break;
    case WM_TIMER://Начинаем выполнять идем ниже
        {
            InvalidateRect(hWnd,&rc,true);// Стираем старое положение шарика
            x+=vx;y+=vy; // новые координаты
            RECT rt;
            GetClientRect(hWnd, &rt); //извлекает координаты рабочей области окна от левого верхнего до нижнего правого угла 
            double w=rt.right;
            double h=rt.bottom;// длина и высота рабочей области
            if(x>w-R)vx=-abs(vx); // проверка отражения от правой стенки
            if(y>h-R)vy=-abs(vy);// проверка низа
            if(x<R)vx=abs(vx); // проверка левой стенки
            if(y<R)vy=abs(vy); // проверка верха
 
            rc.left=x-R;
            rc.top=y-R;
            rc.right=x+R;
            rc.bottom=y+R;
            InvalidateRect(hWnd,&rc,false); // нарисовать новое положение
        }
        break;
    case WM_PAINT :
        {
            PAINTSTRUCT ps;// структура для рисования
            HDC hdc; // описатель контекста устройства для рисования
 
            hdc = BeginPaint(hWnd, &ps);
            //============= (Окраска нашего круга) ===========
            HBRUSH br, obr;  //дескриптор кисти
            br = CreateSolidBrush(RGB(255,0,0)); 
            obr = (HBRUSH)SelectObject(hdc, br);
            //============== (Рисуем наш круг) ============
            Ellipse(hdc,x-R,y-R,x+R,y+R);
            // ===============================================
            SelectObject(hdc, obr); 
            DeleteObject(br); 
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY : // обработка запроса на завершение программы
        KillTimer(hWnd, 1);// Удаляем наш таймер при закрытий окна
        PostQuitMessage(0);
        break;
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.04.2017, 17:29
Ответы с готовыми решениями:

Преобразование TCHAR в int
Есть код: #include &lt;windows.h&gt; HBITMAP bmp; LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; HWND button1, button2,...

Преобразование LPSTR в int
Есть 3 edit'аedit = CreateWindow(&quot;edit&quot;, NULL, WS_EX_CLIENTEDGE | WS_VISIBLE | WS_CHILD | ES_NUMBER, 35, 22, 100, 20, hWnd3, NULL, NULL,...

Преобразование HMODULE в int или DWORD
Здравствуйте, как можно преобразовать HMODULE в int или DWORD? И во что его вообще можно преобразовать?

5
Почетный модератор
Эксперт по компьютерным сетямЭксперт Windows
 Аватар для magirus
28049 / 15785 / 983
Регистрация: 15.09.2009
Сообщений: 67,752
Записей в блоге: 78
11.04.2017, 18:12
и в чем проблема?
0
0 / 0 / 0
Регистрация: 31.03.2017
Сообщений: 9
11.04.2017, 23:14  [ТС]
Цитата Сообщение от magirus Посмотреть сообщение
и в чем проблема?
Предупреждение 1 warning C4244: +=: преобразование "double" в "int", возможна потеря данных
как изменить код, чтобы не было потерь данных ведь при образовании "double" в "int" округляет в меньшую сторону.

Добавлено через 4 часа 29 минут
именно в этом месте
C++
1
x+=vx;y+=vy;
0
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
12.04.2017, 08:23
Лучший ответ Сообщение было отмечено Nick_o_Lay как решение

Решение

C++
1
x += static_cast<int>((vx < 0.0) ? (vx - 0.5) : (vx + 0.5));
1
0 / 0 / 0
Регистрация: 31.03.2017
Сообщений: 9
12.04.2017, 10:40  [ТС]
GoshaM, а можете объяснить принцип работы
C++
1
static_cast<int>((vx < 0.0) ? (vx - 0.5) : (vx + 0.5)
чтобы в будущем не появлялись вопросы.
0
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
12.04.2017, 15:27
Цитата Сообщение от Nick_o_Lay Посмотреть сообщение
GoshaM, а можете объяснить принцип работы
1. Избегаем предупреждений.
Для этого производится явное преобразование
C++
1
x += static_cast<int>(vx);
Тем самым мы даем понять компилятору что преобразование происходит осознанно.
На результат не повлияет, но предупреждение уйдет.

2. Округляем не только в меньшую сторону, но и в большую.
Очевидно если к числу double у которрого дробная часть >=0.5, прибавить 0.5 целая часть этого double увеличится на 1.
2.6 + 0.5 = 3.1 при преобразовании из double в int будет округлено до 3, а если бы не прибавляли 0.5 то округлилось бы до 2.
2.4 + 0.5 = 2.9 по прежнему будет окруляться до 2.
Т.е фактически скорректированное округление будет выглядеть так:
C++
1
x += (vx + 0.5);
Ну естественно нужно учесть и отрицательные числа, а там уже нужно вычитать 0.5.

3. Объеденим 1 и 2.

C++
1
2
3
4
if (vx < 0.0)
     x += static_cast<int>(vx - 0.5);
else
     x += static_cast<int>(vx + 0.5);
Можно тут и остановиться. Но есть такая базовая конструкция языка - условная операция (но это уже почитайте где-нибудь к округлению и преобразованию отношения не имеет), которая позволяет записать подобный код в одну строчку.
Можно еще и скобки сократить от того варианта, чтоя я написал выше:
C++
1
x += static_cast<int>(vx < 0.0 ? vx - 0.5 : vx + 0.5);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.04.2017, 15:27
Помогаю со студенческими работами здесь

Невозможно преобразование int в double
#include &lt;stdafx.h&gt; #include &lt;iostream&gt; #include &lt;time.h&gt; #include &lt;locale.h&gt; using namespace std; #define k 6 #define l 8 ...

Преобразование указателя из char в int и double
указатель sadr является типом char мне нужно перопределить его на типы на int и double int a; double b; void cr(char **sadr) { ...

Некорректное преобразование double в int (приведение типов)
Не совсем очевидно. https://ideone.com/7P0EhY #include &lt;iostream&gt; #include &lt;math.h&gt; int main() { float y = pow(64, 1.0...

Преобразование int и double в char без использования sprintf()
Здравствуйте, ув форумчани! Подскажите пожалуйста, какими инструментами С++ можно преобразовать int, double в char, и самое главное, что...

Работа с векторами E2285 Could not find a match for 'TXYPlot::XYPlot(double,double,int,int,const TColor)'
Добрый вечер! Да, вчера я спросил какую-то чушь, на этот раз возможно тоже. Работаю в 6 билдере. У меня есть функция...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru