Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/55: Рейтинг темы: голосов - 55, средняя оценка - 4.62
 Аватар для BeginerMan
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427

Как сохранить float в переменной типа char?

01.05.2016, 20:43. Показов 12032. Ответов 76
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здрасьте.
Как можно записать float в char ?
И как потом float вытащить из char, если он будет находится примерно посередине ну или в начале?

C++
1
2
3
4
5
6
7
8
float x;
char str[100]
// Запих x в str
//...
// Вытащить float ?
str[0-40] = // ... 
str[41] = //  если я знаю, что float начинается с 41 символа, к примеру
str[45-99] = //....
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.05.2016, 20:43
Ответы с готовыми решениями:

Как присвоить значение одного из элементов массива типа char переменной типа int?
С++ начал буквально только что так что буду благодарен за терпение и понимание ) Сразу оговорюсь что уже искал ответ но на эту тему...

Как сохранить массив типа float в файл, и считать его оттуда?
Есть массив: int *vfile=new int; 1. как можно сохранить его в файл типа .rle 2. в массиве k записей. можно ли сохранить k в файле,...

Преобразование массива типа char в массив типа float
Хорош ли следующий способ преобразования массива типа char в массив типа float? #include <stdio.h> #include <locale.h> ...

76
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
03.05.2016, 16:43
Студворк — интернет-сервис помощи студентам
А зачем в этой конструкции DWORD?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.05.2016, 17:46
Цитата Сообщение от vxg Посмотреть сообщение
указатель это просто некая сущность но никак не адрес по которому можно обратится - и кому он такой "теперь" нужен?
указатель - тип данных, который хранит адрес объекта.
так было раньше, так остается и по сей день.

Цитата Сообщение от vxg Посмотреть сообщение
char *p = (char *)(DWORD)&x;
Будет работать на 32 битных машинах?
да.
каст в char* или в void* - легальный.

вообще, проблема алиасинга возникает
не из-за каста несовместимых указателей,
а из-за попытки разыменовать несовместимый указатель.

гляньте пример:

http://rextester.com/UQNO3434
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
#include <iostream>
 
template<class T> struct wrapper
{
    wrapper(const T& src)
    {
        new (buf) T(src);
    }
    
    operator T&()
    {
        // warning: dereferencing type-punned pointer will break strict-aliasing rules 
        return *reinterpret_cast<T*>(buf);
        
        // лекарство:
        // auto* p = reinterpret_cast<T*>(buf);
        // return *p;
 
        // проблема strict-aliasing заключается 
        // не в самом факте каста между несовместимыми указателями
        // а в разыменовывании такого несовместимого указателя
        
        // если же сначала скастить указатель в другой указатель
        // и только затем разыменовать этот другой указатель
        // то проблема исчезает
        
    }
    
    char buf[sizeof(T)];
};
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    struct some { int v = 33; } obj; 
    
    wrapper<some> wrap(obj);
    
    some& ref = wrap;
    std::cout << ref.v<<std::endl;
}
можно ещё вот так сформулировать:

в конструкции вида:
C++
1
return *reinterpret_cast<T*>(buf);
происходит разыменовывание несовместимого временного указателя.

проблема исчезнет, если вы будете разыменовывать
не временный указатель.

что бы избежать проблемы стриакт-алиасинга,
нужно разыменовывать не временный указатель.

зы: лично я весь код, покрываю юнит-тестами.
и гоняю их под всеми поддерживаемыми компиляторами.

потому что, тот факт, что компилятор перестал кидать ворнинги,
не значит что все хорошо.
внешне вроде бы оно все работает.
однако стандарт здесь уже ничего не гарантирует.

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

Цитата Сообщение от vxg Посмотреть сообщение
float x = 12.34;
char *p = (char *)&x;//теперь мы можем обращаться к байтам float по отдельности
зря я вас взболамутил.
я так понял, что на самом деле это - валидная конструкция.

смотрите, что я нарыл в священном писании:

3.10 Lvalues and rvalues
If a program attempts to access the stored value of an object through a glvalue of other than one of the
following types the behavior is undefined:53
— the dynamic type of the object,
— a cv-qualified version of the dynamic type of the object,
— a type similar (as defined in 4.4) to the dynamic type of the object,
— a type that is the signed or unsigned type corresponding to the dynamic type of the object,
— a type that is the signed or unsigned type corresponding to a cv-qualified version of the dynamic type
of the object,
— an aggregate or union type that includes one of the aforementioned types among its elements or nonstatic
data members (including, recursively, an element or non-static data member of a subaggregate
or contained union),
— a type that is a (possibly cv-qualified) base class type of the dynamic type of the object,
a char or unsigned char type
если я все правильно понял,
то стандарт явным образом разрешает безопасно доставать объекты из чара.

проверяю:
http://rextester.com/PUHO36449
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
#include <iostream>
 
template<class T> struct wrapper
{
    wrapper(const T& src)
    {
        new (buf) T(src);
    }
    
    operator T&()
    {
        // сначала кастим массив к указателю на char
        char* p = buf;
        
        // теперь извлекаем из объекта типа чар 
        return *reinterpret_cast<T*>(p);
    }
    
    char buf[sizeof(T)];
};
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    struct some { int v = 33; } obj; 
    
    wrapper<some> wrap(obj);
    
    some& ref = wrap;
    std::cout << ref.v<<std::endl;
}
никаких больше ворнингов.
4
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
03.05.2016, 23:36
Цитата Сообщение от grizlik78 Посмотреть сообщение
А зачем в этой конструкции DWORD?
это попытка заткнуть оптимизатор в свете новых выкрутасов - попытка сказать "ты, идиотище, я хочу иметь адрес в виде числа, а затем явно сказать тебе тупой оптимизатор что я хочу что бы у меня был указатель на тот тип который мне нужен и указывал он на этот адрес"
Цитата Сообщение от hoggy Посмотреть сообщение
если я все правильно понял,
то стандарт явным образом разрешает безопасно доставать объекты из чара
меня в этом тексте смущает то что он начинается с андефайнед и далее в перечислении как раз идет чар... может мой "литературный" перевод не улавливает каких то оттенков...
так по вашему переводу указатель на любой тип можно безопасно преобразовать в указатель на чар? а обратно? а если это указатель не на чар то сразу становится опасно? я просто *бубнит чисто для себя* не могу понять почему я к примеру не могу хранить кусок памяти в виде скажем массива DWORD'ов и доставать из этого куска все что мне заблагорасудится по смещению через разыменовывание указателя...
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.05.2016, 00:09
Цитата Сообщение от vxg Посмотреть сообщение
может мой "литературный" перевод не улавливает каких то оттенков...
If a program attempts to access the stored value of an object through a glvalue of other than one of the
following types the behavior is undefined:53
"если программа пытается получить доступ к сохраненному значению объекта через glvalue,
которое не такое, как следующие типы, то поведение не определенно"

другими словами, доступ к значению gvalue можно получить только
для указанных в списке типов.

Цитата Сообщение от vxg Посмотреть сообщение
указатель на любой тип можно безопасно преобразовать в указатель на чар? а обратно? а если это указатель не на чар то сразу становится опасно?
вы можете спокойно кастить что угодно, во что угодно.

но если вы попытается получить доступ к объекту через указатель,
то этот указатель должен отвечать положениям стандарта:
3.10 Lvalues and rvalues
2
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
04.05.2016, 07:33
Цитата Сообщение от hoggy Посмотреть сообщение
вы можете спокойно кастить что угодно, во что угодно
зачем мне кастить если то что я получу не работает)? как я понял это только для временных переменных? то есть если я кастую и это хранится в нормальной переменной указателе - все нормально. а если это было некое выражение где я ожидая от компилятора эквивалентности того что записано тому что я имею ввиду написал некий каст - это краш?
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.05.2016, 09:45
Цитата Сообщение от vxg Посмотреть сообщение
как я понял это только для временных переменных? то есть если я кастую и это хранится в нормальной переменной указателе - все нормально.
При кастинге всегда создаётся временный объект. Чёрт его знает, как случаи с побочными эффектами от разных указателей на одну и ту же память, притягиваются к случаю обычного кастинга. В статье много сакральных выражений, призывающих к кресту и молитве высшей форме смирения плоти, отказу заклинания и приведений как наиболее действенной форме экзорцизма (форум не знает слова экзорцизм!), утверждённой высшим синодом братьев во GC. Умом это не понять. Токмо глубоким и истовым покаянием...
2
04.05.2016, 10:37

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
При кастинге всегда создаётся временный объект
Я знаю одного программиста, не буду тыкать пальцем castaway, который закидает вас камнями! :stop:

0
04.05.2016, 10:42

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Я знаю одного программиста, не буду тыкать пальцем castaway, который закидает вас камнями!
Лишь бы интелловскими. "Всегда" - это просто сильное выражение. Всегда не говори "всегда". То есть речь не о полиморфных приведениях или user-defined conversion's а о настоящих исчадиях. :wizard:
:)

0
04.05.2016, 11:39

Не по теме:

IGPIGP, я всеравно считаю, что : "компилятор может производить операции над двумя объектами, если у них одинаковые типы. И если надо неявная/явная конвертация для этого, он не может поменять тип переменной памяти, а лишь создать у себя в глубинках временную переменную и выполнить операцию с ней. То, что временную переменную никто не видит, не означает что её там нету по технологическим процессам". У меня всё)))))

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.05.2016, 11:50
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
я всеравно считаю, что : "компилятор может производить операции над двумя объектами, если у них одинаковые типы. И если надо неявная/явная конвертация для этого, он не может поменять тип переменной памяти, а лишь создать у себя в глубинках временную переменную
А почему шёпотом? Верите что демоны не услышат? Если мы пробуем работать с памятью выделенный под один тип через указатель другого типа, это один случай. А когда Вы заселяете память одного типа значением этого же типа, но полученным разыменованием, приведенного указателя, то это другой случай, как я понял. Если это не так, то грань между очищающей молитвой и очистительной клизмой истончилась до полного исчезновения. О чём говорю с прискорбием в разуме и горечью в сердце моём.
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
04.05.2016, 12:00
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
создать у себя в глубинках временную переменную и выполнить операцию с ней. То, что временную переменную никто не видит, не означает что её там нету по технологическим процессам
именно так полностью с вами согласен и решительно не понимаю почему это должно приводить к падению программы - пусть наздоровье че угодно куда угодно временно копирует но отдаст мне мои данные
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.05.2016, 12:06

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
А почему шёпотом?
Когда я говорил такие вещи вслух пришёл уважаемый упомянутый выше и начал читать мне лекции, что я не прав и не могу это доказать cout'ом - значит я несу ерись.



IGPIGP, вас почитать одни случаи)))) я в целом после знакомства с WinAPI при виде reinterpret_cast вздрагиваю!
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.05.2016, 12:51
Цитата Сообщение от vxg Посмотреть сообщение
именно так полностью с вами согласен и решительно не понимаю почему это должно приводить к падению программы - пусть наздоровье че угодно куда угодно временно копирует но отдаст мне мои данные
Вот-вот. Пример с перегрузкой оператора
Цитата Сообщение от hoggy Посмотреть сообщение
template<class T> struct wrapper {
демонстрирует хитро притаившийся возврат локальной ссылки. Он появляется с внезапно порождённым временным объектом и характерным запахом серы. Хитрый бесёнок. И за напоминание, - спасибо hoggy и преподобным отцам. Но суть связана не с приведением как таковым, а с попыткой его использования. Возврат локальной ссылки - тяжкий грех.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
вас почитать одни случаи)))) я в целом после знакомства с WinAPI при виде reinterpret_cast вздрагиваю!
Это от склонности к анализу. Слаб я в вере моей и анализирую, анализирую... А это приводит к тому, что монолит убеждённой просветлённости распадается на случаи и другие сомнительные частности. А вздрагивать не нужно. Крестись и повторяй using std, using std, using std!
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
04.05.2016, 14:06
Цитата Сообщение от IGPIGP Посмотреть сообщение
хитро притаившийся возврат локальной ссылки
не понял. чего? может код не докопировался...

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

Не по теме:

по ходу эту тему нужно переносить в C++ для профессионалов или закреплять в шапке :)

0
04.05.2016, 14:08

Не по теме:

Цитата Сообщение от vxg Посмотреть сообщение
по ходу эту тему нужно переносить в C++ для профессионалов или закреплять в шапке
с названием : "Как молятся С++ программисты" ?) Я почему-то думал, что большая часть программистов атеисты, но после IGPIGP, вижу, что у них свои боги using std; :p

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.05.2016, 14:10
Цитата Сообщение от vxg Посмотреть сообщение
? может код не докопировался...
Как я понял при кастинге образован временный объект, разыменование которого породило ссылку. Функция (оператор) её вернула и Бум! :
C++
1
2
3
4
5
6
7
8
operator T&()
    {
        // сначала кастим массив к указателю на char
        char* p = buf;
        
        // теперь извлекаем из объекта типа чар 
        return *reinterpret_cast<T*>(p);
    }

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
IGPIGP, вижу, что у них свои боги
In Bjarne we trust!

0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
04.05.2016, 14:12
Цитата Сообщение от IGPIGP Посмотреть сообщение
при кастинге образован временный объект
при известной доле фантазии все можно считать временным объектом. я продолжаю настаивать на том что оптимизатор тут не прав и должен быть предан анафиме
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.05.2016, 14:21
Цитата Сообщение от vxg Посмотреть сообщение
при известной доле фантазии все можно считать временным объектом.
Там указатель временный (его к типу приводят) а сама ссылка то, - адресное выражение, связанное со значением от разыменования. Я ещё не переварил всего. Нахожусь в смятении духа и ожидаю подъёма фанатической экзальтации.
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
04.05.2016, 14:40
Цитата Сообщение от IGPIGP Посмотреть сообщение
Нахожусь в смятении духа и ожидаю подъёма фанатической экзальтации
к счастью от меня скрыта сама суть происходящего. понял лишь что иногда особо фирменный супермодный компилятор самого распоследнего стандарта НЕ майкрософтовский может нагадить (в MS понимают разницу между теорией и практикой как бы они нам нравились или не нравились и не дают мыслеблудию помножить на ноль здравый смысл и рабочий код)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.05.2016, 14:52
Цитата Сообщение от vxg Посмотреть сообщение
к счастью от меня скрыта сама суть происходящего.
У меня аналогично.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.05.2016, 14:52

Как сохранить нажатую клавишу в переменную типа char?
Как сохранить нажатую клавишу в переменную типа char?

Как в один Label Вывести текст и значение переменной типа float?
Пример Картошка: 21 кг Как это вывести в один Label?

Переменной d присвоить первую цифру после запятой некоторой переменной x типа float
Нужно целой переменной d присвоить первую цыфру после комы некоторой переменной x типа float Скажите, пожалуйста, с чего начать и по...

Как работать с переменной типа char?
Не понимаю переменную char и как с ней работать.

Передача переменной типа double из c# в переменную типа float в SQL
Здравствуйте, имеется проблема с передачей данных из кода c# в бд SQL Имеется переменная типа double, к примеру double newPrice =...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru