Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
lips
2 / 2 / 0
Регистрация: 03.01.2012
Сообщений: 283
#1

Преобразовать указатель в float - C++

03.12.2013, 11:00. Просмотров 987. Ответов 27
Метки нет (Все метки)

допустим есть такая структура
C++
1
2
3
4
5
6
7
8
9
10
11
12
    struct lol
    {
        int a;
        float b;
    } ololo;
    ololo.a = 34;
    ololo.b = 2.5;
 
    wchar_t *pt = (wchar_t*)&ololo.a;  //мне нужен такой указатель
    Label1->Caption = (int)*pt;  //выводит прекрасно
    pt++;pt++;
    Label2->Caption = (float)*pt; //выводит бред
как вывести float в таком случае? и можно ли?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
newbie666
Заблокирован
03.12.2013, 11:06     Преобразовать указатель в float #2
Цитата Сообщение от lips Посмотреть сообщение
Label1->Caption = (int)*pt
он выводит 4-х байтовый указатель в десятичном виде (изначально был в 16-чном)

Цитата Сообщение от lips Посмотреть сообщение
Label2->Caption = (float)*pt;
а вот у флоата структура совершенно другая, у него ж какие - то байты отвечают за экспоненту, какие - то за знак и тд

лень пробовать у себя, просто попробуй так: Label2->Caption = (float)(int)*pt;
lips
2 / 2 / 0
Регистрация: 03.01.2012
Сообщений: 283
03.12.2013, 11:15  [ТС]     Преобразовать указатель в float #3
Цитата Сообщение от newbie666 Посмотреть сообщение
он выводит 4-х байтовый указатель в десятичном виде (изначально был в 16-чном)


а вот у флоата структура совершенно другая, у него ж какие - то байты отвечают за экспоненту, какие - то за знак и тд

лень пробовать у себя, просто попробуй так: Label2->Caption = (float)(int)*pt;
не выводит то что нужно ... (выводит 0)
ну да... непонятен мне float вообще... вроде 4 байта занимает... а значения может принимать такие же как и int
где тогда хранятся значения после точки..
palva
2506 / 1728 / 229
Регистрация: 08.06.2007
Сообщений: 6,775
Записей в блоге: 4
03.12.2013, 11:22     Преобразовать указатель в float #4
Цитата Сообщение от lips Посмотреть сообщение
Label1->Caption = (int)*pt;
Здесь pt указатель, *pt это то, на что он указывает - целое число 34. Но компилятор считает, что это указатель на wchar_t. Написав (int) мы даем знать компилятору, что на самом деле там лежит целое число.
Для плавающего надо сначала сдвинуть указатель, чтобы он указывал на область памяти после целого числа, где находится float b. Сдвинуть нужно на четыре байта. Поскольку это указатель на wchar_t, а wchar_t занимает два байта, нужно сдвинуть указатель на 2 единицы. То есть будет (float)*(pt+2).
newbie666
Заблокирован
03.12.2013, 11:23     Преобразовать указатель в float #5
Цитата Сообщение от lips Посмотреть сообщение
непонятен мне float вообще... вроде 4 байта занимает.
Ознакомься с IEEE 754-2008 по ссылке http://ru.wikipedia.org/wiki/IEEE_754-2008
А конкретно float - это одинарная точность - вот http://ru.wikipedia.org/wiki/%D0%A7%...81%D1%82%D0%B8
lips
2 / 2 / 0
Регистрация: 03.01.2012
Сообщений: 283
03.12.2013, 11:27  [ТС]     Преобразовать указатель в float #6
Цитата Сообщение от palva Посмотреть сообщение
Здесь pt указатель, *pt это то, на что он указывает - целое число 34. Но компилятор считает, что это указатель на wchar_t. Написав (int) мы даем знать компилятору, что на самом деле там лежит целое число.
Для плавающего надо сначала сдвинуть указатель, чтобы он указывал на область памяти после целого числа, где находится float b. Сдвинуть нужно на четыре байта. Поскольку это указатель на wchar_t, а wchar_t занимает два байта, нужно сдвинуть указатель на 2 единицы. То есть будет (float)*(pt+2).
C++
1
2
3
    Label1->Caption = (int)*pt;
    pt++;pt++;
    Label2->Caption = (float)*(pt+2);
так? выводит не то...
gazlan
3130 / 1905 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
03.12.2013, 11:30     Преобразовать указатель в float #7
Label2->Caption = (float)*pt; //выводит бред
А чего вы ожидали, присваивая строке значение двоичной переменной?

*pt - это в любом случае (независимо от кастинга) - a, и никогда не - b.
newbie666
Заблокирован
03.12.2013, 11:31     Преобразовать указатель в float #8
Цитата Сообщение от lips Посмотреть сообщение
Label2->Caption = (float)*pt;
Label2->Caption = *(float*)pt;

а так?
palva
2506 / 1728 / 229
Регистрация: 08.06.2007
Сообщений: 6,775
Записей в блоге: 4
03.12.2013, 11:31     Преобразовать указатель в float #9
Цитата Сообщение от lips Посмотреть сообщение
так? выводит не то...
Виноват, был не прав. Не заметил, что в третьей строчке вы указатель уже сдвинули. По моему так должно быть.
C++
1
2
3
    Label1->Caption = (int)*pt;
    pt++;pt++;
    Label2->Caption = (float)*pt;
А что здесь не в порядке с выводом?
lips
2 / 2 / 0
Регистрация: 03.01.2012
Сообщений: 283
03.12.2013, 11:33  [ТС]     Преобразовать указатель в float #10
Цитата Сообщение от gazlan Посмотреть сообщение
А чего вы ожидали, присваивая строке значение двоичной переменной?

*pt - это в любом случае (независимо от кастинга) - a, и никогда не - b.
поля структуры в памяти идут друг за другом... как и в массиве элементы массива
не надо путать меня и остальных пожалуйста
ValeryS
Модератор
6505 / 4971 / 459
Регистрация: 14.02.2011
Сообщений: 16,469
03.12.2013, 11:34     Преобразовать указатель в float #11
а вот так вот нельзя разве?
C++
1
2
int * a=&ololo.a;
float * b =&ololo.b;
зачем здесь адресная арифметика?
зачем приведения к разным типам?
newbie666
Заблокирован
03.12.2013, 11:34     Преобразовать указатель в float #12
чё молчишь? как в моём посте номер 8 правильно выводит же ?
ValeryS
Модератор
6505 / 4971 / 459
Регистрация: 14.02.2011
Сообщений: 16,469
03.12.2013, 11:35     Преобразовать указатель в float #13
Цитата Сообщение от lips Посмотреть сообщение
поля структуры в памяти идут друг за другом...
есть такая штука как выравнивание и не всегда они идут друг за другом, могут быть и "дыры"
lips
2 / 2 / 0
Регистрация: 03.01.2012
Сообщений: 283
03.12.2013, 11:36  [ТС]     Преобразовать указатель в float #14
Цитата Сообщение от palva Посмотреть сообщение
Виноват, был не прав. Не заметил, что в третьей строчке вы указатель уже сдвинули. По моему так должно быть.
C++
1
2
3
    Label1->Caption = (int)*pt;
    pt++;pt++;
    Label2->Caption = (float)*pt;
А что здесь не в порядке с выводом?
ну выводит не то, если значение в b = 2.5 то выводит 0 .... если 1.2 то 39322
palva
2506 / 1728 / 229
Регистрация: 08.06.2007
Сообщений: 6,775
Записей в блоге: 4
03.12.2013, 11:40     Преобразовать указатель в float #15
Цитата Сообщение от gazlan Посмотреть сообщение
А чего вы ожидали, присваивая строке значение двоичной переменной?
Если у ТС с-builder, то нужно еще IntToStr применять. Но ТС утверждает, что у него и без этого целое выводится правильно. Так что не знаю, может он где-то операцию = перегрузил...

Добавлено через 4 минуты
Цитата Сообщение от lips Посмотреть сообщение
ну выводит не то, если значение в b = 2.5 то выводит 0 .... если 1.2 то 39322
Вы лучше скажите, у вас Builder или что? Сишный программист обитаемый на этом форуме понятия не имеет о том, как выводить на Label2->Caption.
Целые числа разве у вас правильно выводит?
lips
2 / 2 / 0
Регистрация: 03.01.2012
Сообщений: 283
03.12.2013, 11:45  [ТС]     Преобразовать указатель в float #16
Цитата Сообщение от newbie666 Посмотреть сообщение
Label2->Caption = *(float*)pt;

а так?
Цитата Сообщение от newbie666 Посмотреть сообщение
чё молчишь? как в моём посте номер 8 правильно выводит же ?
прошу прощения не заметил, правильно) спасибо

Добавлено через 2 минуты
Цитата Сообщение от palva Посмотреть сообщение
Если у ТС с-builder, то нужно еще IntToStr применять. Но ТС утверждает, что у него и без этого целое выводится правильно. Так что не знаю, может он где-то операцию = перегрузил...

Добавлено через 4 минуты

Вы лучше скажите, у вас Builder или что? Сишный программист обитаемый на этом форуме понятия не имеет о том, как выводить на Label2->Caption.
Целые числа разве у вас правильно выводит?
rad studio 10
да всё правильно выводит... только проблема была с float
gazlan
3130 / 1905 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
03.12.2013, 11:47     Преобразовать указатель в float #17
Цитата Сообщение от lips Посмотреть сообщение
не надо путать
Путаетесь только вы. Перечитайте и вникните.
lips
2 / 2 / 0
Регистрация: 03.01.2012
Сообщений: 283
03.12.2013, 11:50  [ТС]     Преобразовать указатель в float #18
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот так вот нельзя разве?
C++
1
2
int * a=&ololo.a;
float * b =&ololo.b;
зачем здесь адресная арифметика?
зачем приведения к разным типам?
просто мне надо вывести очень очень много структур... с очень очень большим кол-вом полей и ещё + структуры в структуре, и тд...
мне проще будет создать массив указателей на начало каждой структуры(что я и сделал циклом) и вывести таким образом все
palva
2506 / 1728 / 229
Регистрация: 08.06.2007
Сообщений: 6,775
Записей в блоге: 4
03.12.2013, 12:03     Преобразовать указатель в float #19
Цитата Сообщение от lips Посмотреть сообщение
только проблема была с float
Возможно, у вас операция = с float не перегружена. Попробуйте использовать тип double.

Добавлено через 3 минуты
Цитата Сообщение от lips Посмотреть сообщение
просто мне надо вывести очень очень много структур...
Не используйте ваш кастинг в рабочей программе. В такой программе потом невозможно будет разобраться. Пишите проще.

Добавлено через 4 минуты
Указатель должен быть на структуру, а не на элемент структуры.
C++
1
2
3
4
5
6
7
8
9
10
    struct lol
    {
        int a;
        float b;
    } ololo, *pt;
    ololo.a = 34;
    ololo.b = 2.5;
 
    Label1->Caption = pt->a;
    Label2->Caption = pt->b;
Добавлено через 4 минуты
Я бы даже так написал последнюю строчку
C++
1
    Label2->Caption = FloatToStr(pt->b);
Но настаивать не буду - мне негде проверить этот код.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2013, 12:04     Преобразовать указатель в float
Еще ссылки по теме:

Как преобразовать все int,float,double в строки LPWSTR, LPCTSTR C++
Почему указатель на указатель объявляется как float **A; C++
C++ Ошибка. Невозможно преобразовать CString в float
C++ Как преобразовать число float в int без потери данных?
C++ Преобразовать из float в string

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

Или воспользуйтесь поиском по форуму:
gazlan
3130 / 1905 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
03.12.2013, 12:04     Преобразовать указатель в float #20
Цитата Сообщение от palva Посмотреть сообщение
Указатель должен быть на структуру, а не на элемент структуры.
Можно, с осторожностью: offsetof
Yandex
Объявления
03.12.2013, 12:04     Преобразовать указатель в float
Ответ Создать тему
Опции темы

Текущее время: 09:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru