Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
BeginerMan
49 / 48 / 14
Регистрация: 17.11.2012
Сообщений: 427
#1

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

01.05.2016, 20:43. Просмотров 1819. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.05.2016, 20:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как сохранить float в переменной типа char? (C++):

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

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

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

Как получить адрес переменной типа unsigned char?
Всем привет! Как получить адрес переменной типа unsigned char? Всё ерунда...

Преобразование типа char в тип float
При считывании из файла чисел (каждое число расположено на новой строке, целая...

Работа с битами: как просмотреть и изменить заданный бит в переменной типа char?
Есть переменная типа char, как посмотреть в нем биты и изменять их?

76
HighPredator
04.05.2016, 14:57     Как сохранить float в переменной типа char?
  #61

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Как молятся С++ программисты
Как молятся не знаю, но как крестятся -- знаю: с севера на юг, затем с запада на восток. Два раза.

0
castaway
04.05.2016, 22:24
  #62

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
При кастинге всегда создаётся временный объект.
Я могу поспорить с этим, но, если честно, у меня нет никакого на это настроения... Если есть сильное желание - говорите, но быстрого ответа не ждите.

0
hoggy
Заблокирован
06.05.2016, 18:20 #63
Цитата Сообщение от vxg Посмотреть сообщение
зачем мне кастить если то что я получу не работает)?
что б работало, нужно либо пасти алиасинг,
либо не говнокодить иметь привычки кастить теплое к мягкому

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

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

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

Цитата Сообщение от IGPIGP Посмотреть сообщение
Возврат локальной ссылки - тяжкий грех.
в примере с враппером нет места возврату локальной ссылки.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7009 / 3302 / 451
Регистрация: 04.12.2011
Сообщений: 9,141
Записей в блоге: 5
06.05.2016, 21:16 #64
Цитата Сообщение от hoggy Посмотреть сообщение
в примере с враппером нет места возврату локальной ссылки.
Это я потом уже понял (вру, - так и не понял). Я не понял на что ссылается ссылка. Переменной нет, а ссылка без переменной как Пьер без ухов. Без обоих, причем.
0
hoggy
Заблокирован
06.05.2016, 22:27 #65
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это я потом уже понял (вру, - так и не понял). Я не понял на что ссылается ссылка. Переменной нет, а ссылка без переменной как Пьер без ухов. Без обоих, причем
как бе в этом суть одной из поломок алиасинга:
- видишь суслика? а он есть.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7009 / 3302 / 451
Регистрация: 04.12.2011
Сообщений: 9,141
Записей в блоге: 5
06.05.2016, 22:31 #66
Цитата Сообщение от hoggy Посмотреть сообщение
как бе в этом суть одной из поломок алиасинга
В данном примере, конкретно, возвращается ссылка без переменной. Случай локальной ссылки очень экзотический и интересный. Я поставил плюс от всей души, так как увидел и задумался о таком впервые. Такой возврат не запускает механизм копирования и на что ссылается такая ссылка знает один компилятор.
0
hoggy
Заблокирован
06.05.2016, 22:45 #67
Цитата Сообщение от IGPIGP Посмотреть сообщение
возвращается ссылка без переменной.
возвращается ссылка которая нацелена на объект,
который живет в чаровом хранилище.

поскольку, после выполнения функции,
хранилище продолжает жить,
то и ссылка получается валидной,
и указывать на живой объект.

здесь нет места "мутным темам".
все оч прозрачно.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7009 / 3302 / 451
Регистрация: 04.12.2011
Сообщений: 9,141
Записей в блоге: 5
06.05.2016, 23:10 #68
Цитата Сообщение от hoggy Посмотреть сообщение
возвращается ссылка которая нацелена на объект,
А он там живёт? Или там размещена информация в формате данных объекта (или нет но есть надежда их так интерпретировать). Вообще, когда говорят о ссылках никто не рискует конкретизировать вопрос её связи с... объектом сущностью размещённой в памяти. Я согласен, что эта сущность не локальна. Но как я понял (если правильно понял) в цепочке чар лежит переменная одного типа, а ссылка - на переменную другого. Но нет такой переменной. Не хочу спорить.
0
hoggy
Заблокирован
06.05.2016, 23:21 #69
Цитата Сообщение от IGPIGP Посмотреть сообщение
А он там живёт? Или там размещена информация в формате данных объекта (или нет но есть надежда их так интерпретировать). Вообще, когда говорят о ссылках никто не рискует конкретизировать вопрос её связи с... объектом сущностью размещённой в памяти. Я согласен, что эта сущность не локальна. Но как я понял (если правильно понял) в цепочке чар лежит переменная одного типа, а ссылка - на переменную другого. Но нет такой переменной. Не хочу спорить.
__________________
мы просто возвращаем ссылку на объект,
который живет "где-то" в памяти.

в данном случае - в чаровом массиве.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7009 / 3302 / 451
Регистрация: 04.12.2011
Сообщений: 9,141
Записей в блоге: 5
06.05.2016, 23:33 #70
Цитата Сообщение от hoggy Посмотреть сообщение
мы просто возвращаем ссылку на объект,
который живет "где-то" в памяти.
В данном примере я увидел что-то нездешнее, согласен. Наслушавшись про "несовместимые" указатели я подумал что объект в char[] создан как один тип, а ссылка - на другой. Сейчас вижу, что память заселена plaсement new и приведение указателя на массив чар к этому типу не кажется ничем крамольным. Тогда, не вижу в чём проблема. То есть не понимаю, чем указатель - локальная переменная p лучше чем временный и созданный при приведении.
0
vxg
Модератор
3231 / 2035 / 319
Регистрация: 13.01.2012
Сообщений: 7,887
07.05.2016, 07:48 #71
hoggy, да уж... Дальше некуда как все оч прозрачно. Знаете, мне кажется что все это затащили в стандарт дабы донести баги оптимизаторов до народа - это именно баги иного названия я не могу придумать - все операции легальны в терминах которые я читал в букварях. Если они теперь играют с терминами, то я пас.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7009 / 3302 / 451
Регистрация: 04.12.2011
Сообщений: 9,141
Записей в блоге: 5
07.05.2016, 10:14 #72
vxg, я глядя на пример подумал о чём-то таком:
Кликните здесь для просмотра всего текста
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
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
template<class S, class T> struct mad_caster
{
    mad_caster(const S& src)
    {
        if(sizeof(S)>=sizeof(T))
        new (buf) S(src);
        else
            throw(1);
    }
    
    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(S)];
};
struct some 
{
    some(const int a_=0, int b_=0, int c_=0):a(a_),b(b_),c(c_){}    
    int a,b,c;
};
struct else_one 
{
    else_one(const int a_):a(a_){}  
    int a;
};  
 
int main()
{
    std::cout << "Hello, world!\n";//Hello, world!    
    some obj(123);       
    mad_caster<some, else_one> rap(obj);    
   else_one ref = rap;
    std::cout << ref.a<<std::endl;//123
    std::cout << std::endl ;
    std::cin.get() ;
return 0 ;
}

То есть, в последних постах пытался донести до всех что-то такое, чего сам пытаюсь понять. Не по делу говорил, иначе говоря.
0
hoggy
Заблокирован
07.05.2016, 14:35 #73
Цитата Сообщение от vxg Посмотреть сообщение
все операции легальны в терминах которые я читал в букварях.
странные у вас какие то буквари.

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

C++
1
2
some* p1 = getSome();
other* p2 = getOther();
some и other никак не связанны друг с другом наследственными узами.
поэтому, каст указателей - нелегален.

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

и на этом выстраивает оптимизацию.

хотя по факту, вы конечно могли создать other,
и вернуть указатель на него, как some*
но это не есть "легальный код".
0
vxg
Модератор
3231 / 2035 / 319
Регистрация: 13.01.2012
Сообщений: 7,887
07.05.2016, 19:48 #74
hoggy, смысл терминов из букварей заключался в том что указатель это адрес, а как его интерпретировать определяется его типом и проблемы будут лишь у тех кто либо пишет бред (то есть каст к тому чего нет по указанному адресу и по определению это нельзя развменовывать) либо кастует классы вверх наплевав на иерархию размещения полей и таблиц вирт функций что можно рассматривать как частный случай варианта номер один. О недопустимости загнать адрес чего угодно в char* void* или даже int и последующем приведении этого обезличенного указателя к любому типу там не говорилось ни слова и вот теперь пошла такая пена...
0
hoggy
Заблокирован
07.05.2016, 19:56 #75
Цитата Сообщение от vxg Посмотреть сообщение
О недопустимости загнать адрес чего угодно в char* void*
это - легально.

Цитата Сообщение от vxg Посмотреть сообщение
или даже int
а это - нелегально.

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

и заложившись на это положение,
он проворачивает некоторые оптимизации.

у вас указатели должны быть связанны родственными отношениями.
для хранилища вы можете использовать чаровые буфера.
но вы не можете легально использовать интовый буфер для этой цели.
0
vxg
Модератор
3231 / 2035 / 319
Регистрация: 13.01.2012
Сообщений: 7,887
07.05.2016, 20:38 #76
Цитата Сообщение от hoggy Посмотреть сообщение
а это - нелегально
с чего бы это если у меня машина 32 бит? в VCL люди запихивают в Tag указатели и живут нормально
Цитата Сообщение от hoggy Посмотреть сообщение
а как же ваши собственные слова?
мои слова следует читать как "я поместил в void* что угодно и не понимаю почему я не могу достать из него что угодно - хотя по факту я конечно буду доставать тот тип что туда положил"
Цитата Сообщение от hoggy Посмотреть сообщение
вы не можете легально использовать интовый буфер для этой цели
почему если я к примеру хочу читать порциями 32 бит или выравнивать или все что угодно КАКОЕ простите сраному оптимизатору до этого дело - пусть делает свою работу и не лезет к "водителю"
0
hoggy
Заблокирован
07.05.2016, 20:56 #77
Цитата Сообщение от vxg Посмотреть сообщение
с чего бы это если у меня машина 32 бит? в VCL люди запихивают в Tag указатели и живут нормально
не принципиально.
в инт можно пихать инт.
пихать в инт не инт - нельзя.

Цитата Сообщение от vxg Посмотреть сообщение
мои слова следует читать как "я поместил в void* что угодно и не понимаю почему я не могу достать из него что угодно - хотя по факту я конечно буду доставать тот тип что туда положил"
можете.

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

Цитата Сообщение от vxg Посмотреть сообщение
почему если я к примеру хочу читать порциями 32 бит или выравнивать или все что угодно КАКОЕ простите сраному оптимизатору до этого дело - пусть делает свою работу и не лезет к "водителю"
он и делает свою работу.
оптимизирует.

для оптимизации ему нужно закладываться на некоторые положения
здравого смысла.

для блобов сделали исключения - чаровое хранилище.

все что вам нужно - придерживаться регламента.

а то у вас батхерт:
хочу слить объект в интовое хранилище, а оно типа - это нельзя!
0
07.05.2016, 20:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2016, 20:56
Привет! Вот еще темы с решениями:

Как полю класса типа char* присвоить значение типа *char
Проблема в строчке 46 (не пинайте сильно за формат кода и за говнокод) ...

Вывод переменной типа char
Переменная x типа char. x = 65; cout &lt;&lt; x; Так выводиться &quot;A&quot;. x =...

проблема с переменной типа char
int count(char a){ int c=0; int words=0; while(a!='\0'){ if(a==' ')++words;...

Вывод адреса переменной типа char
Всем привет! Хочу задать вопрос... есть код: #include &lt;iostream&gt; int...


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

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

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