Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Keil... Как в массив char записать значение float?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
BFunTic
Добрый день, всем!
Подскажите плз! Как в массив типа char записать значение типа float??? С занчениями типа int Я разобрался - оказалось просто, а с флоатом не катит...

...
float A;
unsigned int B;
unsigned char Buff[4];
...
Buff[0] = B >> 8; // Этот пример катит
Buff[1] = B >> 0; //
...
Buff[0] = A >> 24; // Этот пример НЕ катит
Buff[1] = A >> 16; // На стадии компиляции выдает - error C193: '>>' : bad operand type
Buff[2] = A >> 08; //
Buff[3] = A >> 00; //
...

В доках к Keil ошибка C193 - This error results when an expression uses illegal operand-types with the given operator...

Подскажите как правильно написать???

Заранее спасибо!
DASM
Код

Buff[0] = ((unsigned char[])&A)[0];
Buff[1] = ((unsigned char[])&A)[1];
Buff[2] = ((unsigned char[])&A)[2];
Buff[3] = ((unsigned char[])&A)[3];

Итог
Код

MOV     Buff,A        
MOV     Buff+01H,A+01H        
MOV     Buff+02H,A+02H        
MOV     Buff+03H,A+03H

Хотя способов сделать требуемое много.
KRS
А мне кажется самый простой способ
Код
*((float*)Buff) = A;

а для int
Код
*((int*)Buff) = B;
DASM
Не спорю. Правда в Keil big endian, не знаю, относится ли это к float, первым способом поменять порядок можно, а Вашим нет. Ну если это не требуется, то конечно второй проще
BFunTic
Спасибо!!!
Порядок возможно придется менять...
777777
Цитата(DASM @ Dec 26 2007, 11:12) *
Не спорю. Правда в Keil big endian, не знаю, относится ли это к float, первым способом поменять порядок можно, а Вашим нет. Ну если это не требуется, то конечно второй проще

Как раз вторым вариантом можно это сделать правильно, не задумываясь о порядке: компилятор это сам сделает правильно.

Только непонятно: зачем такие извращения? Зачем понадобилось в массив чаров записывать флоат? Может в архитектуре что-то не так?
Baser
Цитата(BFunTic @ Dec 26 2007, 09:36) *
Как в массив типа char записать значение типа float???

Для работы с отдельными байтами можно использовать union
Я всегда определяю union-ы, а потом ими везде где требуется пользуюсь:
Код
union Char2 { int   I;
              char  C[2]; };
union Char2un {
              unsigned int  I;
              unsigned char C[2]; };
union Char3un {
              unsigned int  I;
              unsigned char C[3]; };
union Char4 { float F;
              long  L;
              int   I[2];
              char  C[4]; };
union Char4un {        float F;
              unsigned long  L;
              unsigned int   I[2];
              unsigned char  C[4]; };

union Char2un DataLen;
union Char2un CRC16;
union Char4un Buff;

Далее с ними можно работать, как с любыми типами:
Код
Buff.F = 3.14159;
Buff.L = 1234567;
Buff.I[1] = 3456;
Buff.C[2] = 0x55;
if (Buff.C[0]==Buff.C[3]) .....;


Цитата(777777 @ Dec 26 2007, 13:07) *
Только непонятно: зачем такие извращения? Зачем понадобилось в массив чаров записывать флоат? Может в архитектуре что-то не так?
Это требуется довольно часто, например при передаче параметров по байтовым интерфейсам (UART, SPI и т.д.)
DASM
Цитата(777777 @ Dec 26 2007, 14:07) *
Как раз вторым вариантом можно это сделать правильно, не задумываясь о порядке: компилятор это сам сделает правильно.

Только непонятно: зачем такие извращения? Зачем понадобилось в массив чаров записывать флоат? Может в архитектуре что-то не так?

Что значит "правильно" и не задумываясь ? Положим этот float дальше идет по коммуникационной линии в составе большого пакета, имеющего некий стандарт, ну Modbus напрмер. И low- high там определены. Да куча таких вариантов может быть (и было в практике).
777777
Цитата(Baser @ Dec 26 2007, 14:45) *
Для работы с отдельными байтами можно использовать union

А вот как раз union'ы лучше не использовать: стандарт не гарантирует определенного взаимного расположения наложенных переменных и если ты определил его экспериментально, в другом компиляторе (или даже в новой версии того же) расположение может измениться.
Цитата(Baser @ Dec 26 2007, 14:45) *
Это требуется довольно часто, например при передаче параметров по байтовым интерфейсам (UART, SPI и т.д.)

Тогда зачем его переписывать в другой массив? Просто боращаешься к нему побайтно:
Код
float x;
...
send(((char*)&x)[0]);
send(((char*)&x)[1]);
send(((char*)&x)[2]);
...
// или наоборот - 2,1,0
BFunTic
> Тогда зачем его переписывать в другой массив? Просто боращаешься к нему побайтно...

Я обрабатываю пакет пришедший с ПК... В составе пакета есть как адрес, так и числа в формате float (4 байта IEEE), int (2 байта), char (1 байт)... Как знаковые так и беззнаковые... Мне надо разобрать пакет и собрать новый, отправить к ПК... Вот вообщем-то так...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.