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

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

13.01.2015, 16:29. Показов 4063. Ответов 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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru