Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
2 / 2 / 2
Регистрация: 05.11.2014
Сообщений: 62

Как получить из 4 char получить 1 float

13.01.2015, 16:29. Показов 4274. Ответов 38
Метки нет (Все метки)

Народ всем привет.

Подскажите, пожалуйста, как из 4 char получить 1 float?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.01.2015, 16:29
Ответы с готовыми решениями:

Как из объекта String получить char* (НЕ const char*)
Доброго времени! Стандартная процедура работы с SD-card принимает параметр типа char *. Однако, объект String имеет метод(c_str)который...

Как получить битики float
Здравствуйте! Кто-нибудь знает как получить битики у float? vector<bool>code; int i2 = 0; float one = 1; float x = 0.36...

Как получить значение float после solve
Вот что я считаю polinomials := {x^2+y^2-1, x = 0.5}; p := solve(polinomials); Получаю вот это: p := {x = 1.500000000, y =...

38
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.01.2015, 14:18
Цитата Сообщение от tolstiybh Посмотреть сообщение
demmax2004, Это Ваш код
В 5-й строке используется buff, в отличие от твоего кода, где используется f. К тому же это не лишний float, а второй способ
0
2 / 2 / 2
Регистрация: 05.11.2014
Сообщений: 62
15.01.2015, 14:31  [ТС]
Evg, Я имел ввиду способ реализации (с одним ФЛОАТОМ или с двумя), а не то что он нужен здесь или нет (лишний или нет).
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
15.01.2015, 14:37
Цитата Сообщение от tolstiybh Посмотреть сообщение
Принимается массив из 4 байт типа unsigned char, которые изначально были заложены в переменную float, которая обычно компилятором всегда представляется в виде 4 байт.
откуда принимается?
по сети, из файла?
опиши подробней может быть есть более элегантное решение
0
2 / 2 / 2
Регистрация: 05.11.2014
Сообщений: 62
15.01.2015, 14:56  [ТС]
ValeryS большое спасибо за желание помочь. Но это уже работает. Править нету времени. Сейчас уже решаю другие задачи.

Принимается из hex файла. Из него я считываю нужные мне переменные типа ФЛОАТ (спасибо Evg):
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
float editor_consatnts2::charTofloat (unsigned char *buf)
{
    float f;
    unsigned char l_buf[4];
    int i;
 
    for(i=0;i<4;i++)
        {
            l_buf[i] = *buf;
            buf++;
        }
 
    memcpy (&f, l_buf, sizeof (f));
 
    return f;
}
 
void editor_consatnts2::floatToChar (unsigned char *buf, float f)
{
    unsigned char l_buf[4];
    int i;
 
    for(i=0;i<4;i++)
        {
            l_buf[i] = *buf;
            buf++;
        }
 
    memcpy (l_buf, &f, sizeof (f));
    buf -= 4;
 
    for(i=0;i<4;i++)
        {
            *buf = l_buf[i];
            buf++;
        }
 
}
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
15.01.2015, 16:03
Цитата Сообщение от tolstiybh Посмотреть сообщение
Так что, num - лишний ФЛОАТ!
Что значит лишний ?

Добавлено через 4 минуты
Это просто тихий ужас !!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
float editor_consatnts2::charTofloat (unsigned char *buf)
{
    float f;
    unsigned char l_buf[4];
    int i;
 
    for(i=0;i<4;i++)
        {
            l_buf[i] = *buf;
            buf++;
        }
 
    memcpy (&f, l_buf, sizeof (f));
 
    return f;
}
Смотри как у меня
C++
1
2
3
4
5
6
float editor_consatnts2::charTofloat (unsigned char *buf)
{
    float f;
    memcpy (&f, buf, sizeof (f));
    return f;
}
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.01.2015, 16:07
Цитата Сообщение от demmax2004 Посмотреть сообщение
Смотри как у меня
Дык можно сразу

C
float editor_consatnts2::charTofloat (unsigned char *buf)
{
  return *((float*)buf);
}
Цитата Сообщение от demmax2004 Посмотреть сообщение
Это просто тихий ужас !!
Москва, к слову говоря, тоже не сразу построилась
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
15.01.2015, 16:23
Цитата Сообщение от Evg Посмотреть сообщение
Дык можно сразу
Вопрос только код меньше получится при ассемблерном листинге
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
15.01.2015, 16:57
Цитата Сообщение от tolstiybh Посмотреть сообщение
Принимается из hex файла.
это текстовый формат
чем не устраивает
double atof (const char *string)
или
int fscanf(FILE *stream, const char *format, ...);
вот пример считывания из файла float и строки
C++
1
2
3
4
char str[80];
float f;
 
fscanf(fp, "%s%f", str, &f);
отсюда
http://cpp.com.ru/shildt_spr_po_c/13/fscanf.html
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.01.2015, 18:04
Цитата Сообщение от demmax2004 Посмотреть сообщение
Вопрос только код меньше получится при ассемблерном листинге
Вообще говоря, от компилятора зависит. Для умного компилятора эти два варианта генерируют эквивалентный код, т.к. вызов memcpy заменится на непосредственное копирование, а потом лишние звенья из цепочки копирований будут удалены

C
#include <string.h>
 
float foo (unsigned char *buf)
{
    float f;
    memcpy (&f, buf, sizeof (f));
    return f;
}
 
float bar (unsigned char *buf)
{
  return *((float*)buf);
}
Code
$ gcc t.c -O3 -S
$ cat t.s
...
foo:
        movl    4(%esp), %eax
        flds    (%eax)
        ret
...
bar:
        movl    4(%esp), %eax
        flds    (%eax)
        ret
...
Цитата Сообщение от ValeryS Посмотреть сообщение
это текстовый формат
Какое-то странное предположение, особенно с учётом того, что ты даже самого файла не видел, а ТС утверждает, что приведённые коды у него работают
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
15.01.2015, 18:15
Цитата Сообщение от Evg Посмотреть сообщение
Какое-то странное предположение,
это не предположение
hex формат в текстовом режиме записывает всякие циферки
достаточно открыть hex файл в блокноте и hex редакторе
Intel HEX — формат файла, предназначенного для представления произвольных двоичных данных в текстовом виде.
https://ru.wikipedia.org/wiki/Intel_HEX
Цитата Сообщение от Evg Посмотреть сообщение
ТС утверждает, что приведённые коды у него работают
Он не указал самую мелочь, как считывается файл
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.01.2015, 18:18
Цитата Сообщение от ValeryS Посмотреть сообщение
Он не указал самую мелочь, как считывается файл
Он же сказал, что это hex. Ты вроде бы не первый день на форуме,должен понимать, что у начинающих это означает НЕстроковой файл. Т.е. открывает он файл блокнотом, а там вместо "1.0000" записаны какие-то крякозябры (которые есть байтовый образ). Соответственно файл читается в буфер как набор байтов, а оттуда извлекаются float'ы
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
15.01.2015, 18:26
Цитата Сообщение от Evg Посмотреть сообщение
Он же сказал, что это hex.
Ну и я про тоже
Цитата Сообщение от Evg Посмотреть сообщение
Ты вроде бы не первый день на форуме,должен понимать, что у начинающих это означает НЕстроковой файл.
Вот и пускай объяснит а лучше скинет пример файла
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. открывает он файл блокнотом, а там вместо "1.0000" записаны какие-то крякозябры
может, если это bin
а если hex то набор всяких циферок

хотя с atof это я погорячился признаю
atof ведь преобразует строку типа "1.000" в 1.000 а не "25 37 16 22"
тоже и к fscanf относится
"Миль пардон, Мин Херц. Обосрался"
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.01.2015, 18:30
Цитата Сообщение от ValeryS Посмотреть сообщение
может, если это bin
Это исключительно вопрос терминологии. У него именно то, что ты, судя по всему, называешь bin. Я, честно говоря, даже не знаю, как это по пацански правильно называется

Цитата Сообщение от ValeryS Посмотреть сообщение
atof ведь преобразует строку типа "1.000" в 1.000 а не "25 37 16 22"
Собственно, из-за этого я и встрял
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
15.01.2015, 19:33
На VS2012
C параметром максимальная скорость, минимальный код (вообщем при любом параметре)
Assembler
1
2
3
4
5
6
7
8
9
foo() 
    push    ebp
    mov ebp, esp
    push    ecx
    mov eax, DWORD PTR [ecx]
    mov DWORD PTR _f$[ebp], eax
    movss   xmm0, DWORD PTR _f$[ebp]
    leave
    ret 0
Assembler
1
2
3
bar()
    movss   xmm0, DWORD PTR [ecx]
    ret 0
Добавлено через 5 минут
Вот так
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.01.2015, 20:01
Вот это и есть цепочка избыточных копирований

Code
    mov eax, DWORD PTR [ecx]
    mov DWORD PTR _f$[ebp], eax
    movss xmm0, DWORD PTR _f$[ebp]
она эквивалентна единственной пересылке "movss xmm0, DWORD PTR [ecx]" из которой и состоит второй код. А, построив такую единственную пересылку весь остальной хлам в коде (push'и) становится ненужным. Слабо верится в то, что MSVS настолько кривой, что с этим не справилcя, так что подозреваю, что ты как-то не так компилятор запускаешь. Я сам MSVS'ом не пользуюсь, так что тут не советчик
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
15.01.2015, 20:12
Цитата Сообщение от Evg Посмотреть сообщение
так что подозреваю, что ты как-то не так компилятор запускаешь.
ну ты юморист
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.01.2015, 21:28
При использовании опции /O2 получил такой код. Как минимум в нём нет левых push'ей. Правда возврат происходит не в том регистре, что у тебя, но наверное тут ещё надо тип архитектуры настраивать, я как-то не вкурил, как это делать. Если задать параметр /Os (уменьшение размера кода), то у меня тоже возникают push'и. Так что не такой уж я и юморист. А микрософтовский компилятор как-то и вправду неприятно удивил, что не сумел мусор в коде разгрести. Правда у меня старая версия - от MSVS-2008

Code
00000000 <_foo>:
   0:   8b 44 24 04             mov    0x4(%esp),%eax
   4:   8b 08                   mov    (%eax),%ecx
   6:   89 4c 24 04             mov    %ecx,0x4(%esp)
   a:   d9 44 24 04             flds   0x4(%esp)
   e:   c3                      ret
 
00000000 <_bar>:
   0:   8b 44 24 04             mov    0x4(%esp),%eax
   4:   d9 00                   flds   (%eax)
   6:   c3                      ret
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
15.01.2015, 21:38
Цитата Сообщение от Evg Посмотреть сообщение
При использовании опции /O2 получил такой код.
Могу видео заснять если не веришь.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.01.2015, 22:08
В итоге я вижу, что у msvs'а проблемы с перемещением плавающих переменных на регистр в тех случаях, когда было взятие адреса на переменную. Компиляторы традиционно боятся переменных со взятым адресом, но в таком простом примере - это уже перебор

C
#if 0
#define float int
#endif
 
float foo (float ff)
{
  float f;
  f = 0;
  return f;
}
 
float bar (float ff)
{
  float f;
  *((int*)&f) = 0;
  return f;
}
получаем код

Code
00000000 <_foo>:
   0:   d9 ee                   fldz
   2:   c3                      ret
 
00000000 <_bar>:
   0:   51                      push   %ecx
   1:   c7 04 24 00 00 00 00    movl   $0x0,(%esp)
   8:   d9 04 24                flds   (%esp)
   b:   59                      pop    %ecx
   c:   c3                      ret
теперь заменяем "#if 0" на "#if 1" (т.е. вместо float используем int) и видим, что с целочисленными проблем нет

Code
00000000 <_foo>:
   0:   33 c0                   xor    %eax,%eax
   2:   c3                      ret
 
00000000 <_bar>:
   0:   33 c0                   xor    %eax,%eax
   2:   c3                      ret
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.01.2015, 22:08

Как из байта получить char?
a:byte; b:char; a:=$AD Нужно чтобы после преобразования b='AD' Как сделать?

Как из QString получить char* ?
QString q = &quot;12334&quot;; нужен указатель на объект с этими циферками типа char*

Как получить текущую дату в char*
Искал, везде старые методы, не работают.Нужно получить только текущую дату в char*. Буду благодарен за помощь.

Как получить массив int'ов из строчки char?
Собственно весь вопрос в теме. Как получить массив int'ов из строчки char? Вот мои попытки: int data_bin = atoi(data); //это...

Как получить const BYTE *?(из string или char)
Есть строчку, которую может ввести юзер(строчка = путь к файлу). Нужно получить из этого cons BYTE * Как это сделать?


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru