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

Как работает приведение типов

06.11.2012, 10:06. Показов 1498. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил создать новую тему, так как вообще не понимаю, каким образом C++ преобразует один тип в другой. Я например пишу:
C++
1
2
char s = '5';
cout << (int)s;
и получаю 53 вместо 5. Тоже самое касается и определенных в WinAPI типов. Когда я привожу тип LCSTR к типу int (только не спрашивайте зачем), то получаю в ответ четыреста с лишним тысяч, хотя должно быть не больше 255.
Объясните (желательно с примерами), как работает приведение типов в C++. Какие вообще способы существуют?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.11.2012, 10:06
Ответы с готовыми решениями:

Приведение типов данных
Всем привет! Нашел в интернете вот такой код: #include &lt;windows.h&gt; #include &lt;iostream&gt; using namespace std; void ReRun() { ...

Как работает приведение типов
#include &lt;stdio.h&gt; int main(void) { printf(&quot;%d&quot;, (int*)3 + 4); return 0; } То что выведется 19 проверить можно. Но...

Приведение типов: как работает reinterpret_cast<>() ?
Хочу разобраться до конца с приведением типов а именно интересует reinterpret_cast&lt;&gt;(), хотя бы в общих чертах логика этой функции, на...

9
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
06.11.2012, 10:44
Насчёт твоего примера. Необходимо помнить, что все символы некоторым образом закодированы. Открой где-нибудь таблицу кодировок символов
http://biocyborg.narod.ru/rev/ascii.htm
и ты увидишь, что символ '5' закодирован числом 53. Ну то есть если тебе необходимо представить число 53 в виде символа, то выведется символ '5' и наоборот, если тебе надо представить символ '5' в виде числа, то выведется 53. Что и происходит, так что всё правильно и предсказуемо.
0
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
06.11.2012, 11:52  [ТС]
А если у меня например строка "0xFF", то как ее перевестив целочисленное?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
06.11.2012, 11:54
atoi
.
0
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
06.11.2012, 12:04  [ТС]
Цитата Сообщение от Vourhey Посмотреть сообщение
atoi
.
Эта функция мне постоянно выдает ноль, когда я перевожу строку типа LCSTR к int:\ пытался привестик другим типам уже внутри функциия, но эффект аналогичный

Добавлено через 4 минуты
в общем вот такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
TCHAR ColorCode[6];
        LPCSTR red, green, blue;
        int i = 0, ColorRed = 0, ColorGreen = 0, ColorBlue = 0;
case WM_COMMAND:
             if(LOWORD(wParam) == ID_BUTTON) {
                 if(i == 1) {SetRect(&rect, 5, 150, 100, 250); InvalidateRect(hwnd, &rect, 1);}
                 i++;
                 GetWindowText(Edit, ColorCode, 7);
                 red = "0x" + ColorCode[0] + ColorCode[1];
                 green = "0x" + ColorCode[2] + ColorCode[3];
                 blue = "0x" + ColorCode[4] + ColorCode[5];
                 ColorRed = (int)red;
                 ColorGreen = (int)green;
                 ColorBlue = (int)blue;
                 sprintf(ColorCode_2, "%u", ColorGreen);
                 hDC = GetDC(hwnd);
                 TextOut(hDC, 10, 200, ColorCode_2, strlen(ColorCode_2));
                 SetRect(&rect, 350, 0, 500, 360);
                 FillRect(hDC, &rect, CreateSolidBrush(RGB(ColorRed, ColorGreen, ColorBlue)));
                 ReleaseDC(hwnd, hDC);
                 }
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
06.11.2012, 12:30
Цитата Сообщение от angryjack93 Посмотреть сообщение
мне постоянно выдает ноль
Если число не в десятичной системе счисления, то да. Для 16-ричных числе можешь strtol использовать.
0
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
06.11.2012, 12:44  [ТС]
ну и? все равно ноль выдает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 char *a, *b, *c;
case WM_COMMAND:
             if(LOWORD(wParam) == ID_BUTTON) {
                 if(i == 1) {SetRect(&rect, 5, 150, 100, 250); InvalidateRect(hwnd, &rect, 1);}
                 i++;
                 GetWindowText(Edit, ColorCode, 7);
                 red = "0x" + ColorCode[0] + ColorCode[1];
                 green = "0x" + ColorCode[2] + ColorCode[3];
                 blue = "0x" + ColorCode[4] + ColorCode[5];
                 ColorRed = strtol(red, &a, 16);
                 ColorGreen = strtol(green, &b, 16);
                 ColorBlue = strtol(blue, &c, 16);
                 sprintf(ColorCode_2, "%u", ColorGreen);
                 hDC = GetDC(hwnd);
                 TextOut(hDC, 10, 200, ColorCode_2, strlen(ColorCode_2));
                 SetRect(&rect, 350, 0, 500, 360);
                 FillRect(hDC, &rect, CreateSolidBrush(RGB(ColorRed, ColorGreen, ColorBlue)));
                 ReleaseDC(hwnd, hDC);
                 }
если я конечно правильно функцию использовал
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
06.11.2012, 12:56
По-хорошему-то должен написать: вот в функцию такую-то я подаю то-то и то-то, на выходе то-то и то-то вместо ожидаемого. А у тебя чёрт ногу сломит.

Цитата Сообщение от angryjack93 Посмотреть сообщение
sprintf(ColorCode_2, "%u", ColorGreen);
...я сам должен догадаться, что такое ColorCode_2?

C++
1
2
3
red = "0x" + ColorCode[0] + ColorCode[1];
green = "0x" + ColorCode[2] + ColorCode[3];
blue = "0x" + ColorCode[4] + ColorCode[5];
явно видно, что этот код имеет отношение к проблемному вызову sprintf (в последнем я не уверен), как свинья к апельсинам. Зачем ты его пишешь? Что бы я споткнулся о него. Ладно, я споткнулся.
0
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
06.11.2012, 17:41  [ТС]
не, он тут просто, чтобы узнать какое число хранится в ColorGreen а вот в нем хранится как раз таки ноль. Я и хочу узнать почему

Добавлено через 4 часа 32 минуты
Ну народ, поможете кто или нет? Мне уже запарилось самому, пришлось перейти на метод тыка уже((((
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        TCHAR ColorCode[6];
        LPCSTR red, green, blue;
        int i = 0, ColorRed = 0, ColorGreen = 0, ColorBlue = 0;
        case WM_COMMAND:
             if(LOWORD(wParam) == ID_BUTTON) {
                 if(i == 1) {SetRect(&rect, 5, 150, 100, 250); InvalidateRect(hwnd, &rect, 1);}
                 i++;
                 GetWindowText(Edit, ColorCode, 7);
                 red = "0x" + ColorCode[0] + ColorCode[1];
                 green = "0x" + ColorCode[2] + ColorCode[3];
                 blue = "0x" + ColorCode[4] + ColorCode[5];
                 ColorRed = strtol(red, NULL, 16);
                 ColorGreen = strtol(green, NULL, 16);
                 ColorBlue = strtol(blue, NULL, 16);
                 hDC = GetDC(hwnd);
                 SetRect(&rect, 350, 0, 500, 360);
                 FillRect(hDC, &rect, CreateSolidBrush(RGB(ColorRed, ColorGreen, ColorBlue)));
                 ReleaseDC(hwnd, hDC);
                 }
Вот в общем весь кодо сообщения и я ваще не впариваю как тут да что сделать для вывода нужного цвета в прямоугольнике
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33402 / 21512 / 8236
Регистрация: 22.10.2011
Сообщений: 36,913
Записей в блоге: 12
06.11.2012, 17:58
Чего ты творишь?

C++
1
2
3
4
5
6
7
8
9
10
        case WM_COMMAND:
            if(LOWORD(wParam)==ID_BUTTON)
            {
                GetWindowText(Edit, ColorCode, 6);
                DWORD color = strtol(ColorCode, NULL, 16);
                 hDC = GetDC(hwnd);
                 SetRect(&rect, 350, 0, 500, 360);
                 FillRect(hDC, &rect, CreateSolidBrush(RGB(GetRValue(color), GetGValue(color), GetBValue(color))));
                 ReleaseDC(hwnd, hDC);
            }
, только не забудь удалять созданную кисть, а то у тебя утечка будет...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.11.2012, 17:58
Помогаю со студенческими работами здесь

Объясните, как в примере работает приведение типов
Вот такой пример: #include &lt;stdio.h&gt; #include &lt;pthread.h&gt; void * any_func (void * arg) { int a = *(int *) arg; a++; ...

Не требуется приведение типов при умножении типов Byte
Читал тут книгу(Г. Шилдт, &quot;Полный справочник по C#&quot;), и нашел такое (ст. 77) Поскольку при умножении, например, 2 чисел типа byte,...

Неправильное приведение типов или как?
Короче вот код void CMyDialog::OnBnClickedButtonEdit() { double number ; CString t; number= (t_f+t_o+t_m+t_d+t_b+t_i+t_s)/7; ...

float to double. Как происходит приведение типов?
double x = 1.01F; float y = 1.01F; Console.Write(x); // 1.00999 Console.WriteLine(); Console.Write(y); // 1.01 Console.Read(); ...

Работа с типом Object: как лучше реализовать приведение типов и сравнение
Добрый день Такая задача, есть COM-объект возвращающий по запросу некие переменные другой программы, которые могут быть типа: Integer,...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru