2 / 2 / 2
Регистрация: 05.11.2014
Сообщений: 62

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

13.01.2015, 16:29. Показов 4385. Ответов 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
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 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,876
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
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 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,876
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
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 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,876
15.01.2015, 18:15
Цитата Сообщение от Evg Посмотреть сообщение
Какое-то странное предположение,
это не предположение
hex формат в текстовом режиме записывает всякие циферки
достаточно открыть hex файл в блокноте и hex редакторе
Intel HEX — формат файла, предназначенного для представления произвольных двоичных данных в текстовом виде.
https://ru.wikipedia.org/wiki/Intel_HEX
Цитата Сообщение от Evg Посмотреть сообщение
ТС утверждает, что приведённые коды у него работают
Он не указал самую мелочь, как считывается файл
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
15.01.2015, 18:18
Цитата Сообщение от ValeryS Посмотреть сообщение
Он не указал самую мелочь, как считывается файл
Он же сказал, что это hex. Ты вроде бы не первый день на форуме,должен понимать, что у начинающих это означает НЕстроковой файл. Т.е. открывает он файл блокнотом, а там вместо "1.0000" записаны какие-то крякозябры (которые есть байтовый образ). Соответственно файл читается в буфер как набор байтов, а оттуда извлекаются float'ы
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
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
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 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
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 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
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 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
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru