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

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

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

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

03.12.2013, 11:00. Просмотров 1062. Ответов 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 в таком случае? и можно ли?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2013, 11:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Преобразовать указатель в float (C++):

Почему указатель на указатель объявляется как float **A; - C++
Почему float?

Преобразовать указатель одного типа в указатель другого. - C++
Всем привет. Мне нужно выполнить задание "Преобразовать указатель одного типа в указатель другого. " Что-то совсем не понимаю. Помогите...

double указатель и float матрица - C++
Очень срочно нужно. Есть 2-мерный массив типа float. Есть указатель на double. double *pj=NULL; float h; Как правильно...

Преобразовать строку в float - C++
Итак у меня есть переменная Char. В ней записано '5.2'. И есть переменная float. Как мне поместить 5.2 в переменную типа float ? Типа...

Преобразовать из float в string - C++
Скажите, пжл, какие существуют ф-ии для конвертации из float в string?

Преобразовать string в float - C++
Привет! Подскажите, пожалуйста, наиболее простой способ, как преобразовать значение типа string в float.

27
newbie666
Заблокирован
03.12.2013, 11:06 #2
Цитата Сообщение от lips Посмотреть сообщение
Label1->Caption = (int)*pt
он выводит 4-х байтовый указатель в десятичном виде (изначально был в 16-чном)

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

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


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

лень пробовать у себя, просто попробуй так: Label2->Caption = (float)(int)*pt;
не выводит то что нужно ... (выводит 0)
ну да... непонятен мне float вообще... вроде 4 байта занимает... а значения может принимать такие же как и int
где тогда хранятся значения после точки..
0
palva
2747 / 1848 / 266
Регистрация: 08.06.2007
Сообщений: 7,028
Записей в блоге: 4
03.12.2013, 11:22 #4
Цитата Сообщение от lips Посмотреть сообщение
Label1->Caption = (int)*pt;
Здесь pt указатель, *pt это то, на что он указывает - целое число 34. Но компилятор считает, что это указатель на wchar_t. Написав (int) мы даем знать компилятору, что на самом деле там лежит целое число.
Для плавающего надо сначала сдвинуть указатель, чтобы он указывал на область памяти после целого числа, где находится float b. Сдвинуть нужно на четыре байта. Поскольку это указатель на wchar_t, а wchar_t занимает два байта, нужно сдвинуть указатель на 2 единицы. То есть будет (float)*(pt+2).
1
newbie666
Заблокирован
03.12.2013, 11:23 #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
1
lips
2 / 2 / 0
Регистрация: 03.01.2012
Сообщений: 287
03.12.2013, 11:27  [ТС] #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);
так? выводит не то...
0
gazlan
3132 / 1908 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
03.12.2013, 11:30 #7
Label2->Caption = (float)*pt; //выводит бред
А чего вы ожидали, присваивая строке значение двоичной переменной?

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

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

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

Добавлено через 4 минуты
Цитата Сообщение от lips Посмотреть сообщение
ну выводит не то, если значение в b = 2.5 то выводит 0 .... если 1.2 то 39322
Вы лучше скажите, у вас Builder или что? Сишный программист обитаемый на этом форуме понятия не имеет о том, как выводить на Label2->Caption.
Целые числа разве у вас правильно выводит?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2013, 11:40
Привет! Вот еще темы с ответами:

Ошибка. Невозможно преобразовать CString в float - C++
Здравствуйте! Программа заключается в следующем - пользователь добавляет в EditControl данные, нажимает на ОК, и эти данные попадают в...

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing - C++
#include<stdio.h> #include<stdlib.h> #include<math.h> float f1(float x)/*vira*enie 1*/ {return (x*cos(x))/(1+ pow(x,2));} ...

На входе дробное число, которое надо преобразовать во float - C++
Здравствуйте, столкнулся со следующей проблемой: на входе дробное число которое читается из потока посимвольно (состоит из 3 знаков 3.2 ...

Как преобразовать число float в int без потери данных? - C++
Здравствуйте, форумчане. Столкнулась с такой проблемой: для работы программы требуется целое число, но вводится число типа float. Так вот,...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
03.12.2013, 11:40
Ответ Создать тему
Опции темы

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