реклама на сайте
подробности

 
 
> Keil... Как в массив char записать значение float?
BFunTic
сообщение Dec 26 2007, 07:36
Сообщение #1





Группа: Новичок
Сообщений: 10
Регистрация: 25-11-07
Пользователь №: 32 675



Добрый день, всем!
Подскажите плз! Как в массив типа 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...

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

Заранее спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
DASM
сообщение Dec 26 2007, 07:47
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Код

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

Хотя способов сделать требуемое много.
Go to the top of the page
 
+Quote Post
KRS
сообщение Dec 26 2007, 07:54
Сообщение #3


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



А мне кажется самый простой способ
Код
*((float*)Buff) = A;

а для int
Код
*((int*)Buff) = B;
Go to the top of the page
 
+Quote Post
DASM
сообщение Dec 26 2007, 08:12
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Не спорю. Правда в Keil big endian, не знаю, относится ли это к float, первым способом поменять порядок можно, а Вашим нет. Ну если это не требуется, то конечно второй проще
Go to the top of the page
 
+Quote Post
BFunTic
сообщение Dec 26 2007, 08:18
Сообщение #5





Группа: Новичок
Сообщений: 10
Регистрация: 25-11-07
Пользователь №: 32 675



Спасибо!!!
Порядок возможно придется менять...

Сообщение отредактировал BFunTic - Dec 26 2007, 08:20
Go to the top of the page
 
+Quote Post
777777
сообщение Dec 26 2007, 11:07
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



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

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

Только непонятно: зачем такие извращения? Зачем понадобилось в массив чаров записывать флоат? Может в архитектуре что-то не так?
Go to the top of the page
 
+Quote Post
Baser
сообщение Dec 26 2007, 11:45
Сообщение #7


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(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 и т.д.)
Go to the top of the page
 
+Quote Post
DASM
сообщение Dec 26 2007, 11:53
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(777777 @ Dec 26 2007, 14:07) *
Как раз вторым вариантом можно это сделать правильно, не задумываясь о порядке: компилятор это сам сделает правильно.

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

Что значит "правильно" и не задумываясь ? Положим этот float дальше идет по коммуникационной линии в составе большого пакета, имеющего некий стандарт, ну Modbus напрмер. И low- high там определены. Да куча таких вариантов может быть (и было в практике).
Go to the top of the page
 
+Quote Post
777777
сообщение Dec 26 2007, 13:09
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(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
Go to the top of the page
 
+Quote Post
BFunTic
сообщение Dec 28 2007, 22:05
Сообщение #10





Группа: Новичок
Сообщений: 10
Регистрация: 25-11-07
Пользователь №: 32 675



> Тогда зачем его переписывать в другой массив? Просто боращаешься к нему побайтно...

Я обрабатываю пакет пришедший с ПК... В составе пакета есть как адрес, так и числа в формате float (4 байта IEEE), int (2 байта), char (1 байт)... Как знаковые так и беззнаковые... Мне надо разобрать пакет и собрать новый, отправить к ПК... Вот вообщем-то так...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 20:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01444 секунд с 7
ELECTRONIX ©2004-2016