6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 449
1

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

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

Author24 — интернет-сервис помощи студентам
допустим есть такая структура
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.12.2013, 11:00
Ответы с готовыми решениями:

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

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

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

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

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

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

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


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

лень пробовать у себя, просто попробуй так: Label2->Caption = (float)(int)*pt;
не выводит то что нужно ... (выводит 0)
ну да... непонятен мне float вообще... вроде 4 байта занимает... а значения может принимать такие же как и int
где тогда хранятся значения после точки..
0
4223 / 2920 / 685
Регистрация: 08.06.2007
Сообщений: 9,795
Записей в блоге: 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
Заблокирован
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/%... 1%82%D0%B8
1
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 449
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
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
03.12.2013, 11:30 7
Label2->Caption = (float)*pt; //выводит бред
А чего вы ожидали, присваивая строке значение двоичной переменной?

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

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

*pt - это в любом случае (независимо от кастинга) - a, и никогда не - b.
поля структуры в памяти идут друг за другом... как и в массиве элементы массива
не надо путать меня и остальных пожалуйста
0
Модератор
Эксперт по электронике
8902 / 6672 / 917
Регистрация: 14.02.2011
Сообщений: 23,501
03.12.2013, 11:34 11
а вот так вот нельзя разве?
C++
1
2
int * a=&ololo.a;
float * b =&ololo.b;
зачем здесь адресная арифметика?
зачем приведения к разным типам?
0
Заблокирован
03.12.2013, 11:34 12
чё молчишь? как в моём посте номер 8 правильно выводит же ?
1
Модератор
Эксперт по электронике
8902 / 6672 / 917
Регистрация: 14.02.2011
Сообщений: 23,501
03.12.2013, 11:35 13
Цитата Сообщение от lips Посмотреть сообщение
поля структуры в памяти идут друг за другом...
есть такая штука как выравнивание и не всегда они идут друг за другом, могут быть и "дыры"
0
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 449
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
4223 / 2920 / 685
Регистрация: 08.06.2007
Сообщений: 9,795
Записей в блоге: 4
03.12.2013, 11:40 15
Цитата Сообщение от gazlan Посмотреть сообщение
А чего вы ожидали, присваивая строке значение двоичной переменной?
Если у ТС с-builder, то нужно еще IntToStr применять. Но ТС утверждает, что у него и без этого целое выводится правильно. Так что не знаю, может он где-то операцию = перегрузил...

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

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

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

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

Вы лучше скажите, у вас Builder или что? Сишный программист обитаемый на этом форуме понятия не имеет о том, как выводить на Label2->Caption.
Целые числа разве у вас правильно выводит?
rad studio 10
да всё правильно выводит... только проблема была с float
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
03.12.2013, 11:47 17
Цитата Сообщение от lips Посмотреть сообщение
не надо путать
Путаетесь только вы. Перечитайте и вникните.
0
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 449
03.12.2013, 11:50  [ТС] 18
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот так вот нельзя разве?
C++
1
2
int * a=&ololo.a;
float * b =&ololo.b;
зачем здесь адресная арифметика?
зачем приведения к разным типам?
просто мне надо вывести очень очень много структур... с очень очень большим кол-вом полей и ещё + структуры в структуре, и тд...
мне проще будет создать массив указателей на начало каждой структуры(что я и сделал циклом) и вывести таким образом все
0
4223 / 2920 / 685
Регистрация: 08.06.2007
Сообщений: 9,795
Записей в блоге: 4
03.12.2013, 12:03 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);
Но настаивать не буду - мне негде проверить этот код.
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
03.12.2013, 12:04 20
Цитата Сообщение от palva Посмотреть сообщение
Указатель должен быть на структуру, а не на элемент структуры.
Можно, с осторожностью: offsetof
0
03.12.2013, 12:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.12.2013, 12:04
Помогаю со студенческими работами здесь

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

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

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

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing
#include<stdio.h> #include<stdlib.h> #include<math.h> float f1(float x)/*vira*enie 1*/ ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru