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

 
 
 
Reply to this topicStart new topic
> Сохранение вещественного числа побайтно в память
Hastja
сообщение Apr 4 2007, 08:47
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 21-11-05
Пользователь №: 11 170



Кто сталкивался, подскажите аль поделитесь идеями, как красиво сохранить вещественне число побайтно в память, в какую - это уже аппаратный вид реализации.
Язык Си.

Сам могу предположить:
- преобразовать в строковый тип библиотечными функциями и сохранить побайтно.
- сделать ассемблерную вставку, а там все сделать.

Хотелось бы выслушить ваши предложения,
по возможности реализацию.
Заранее благодарен за любые старания.
Go to the top of the page
 
+Quote Post
wodya
сообщение Apr 4 2007, 10:14
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 27-03-07
Пользователь №: 26 549



Насколько я понял нужно получить доступ к каждому байту вещественного числа.

Я делаю так

float x;
*((BYTE*)(&x)) - первый байт
*((BYTE*)(&x)+1) - второй байт
*((BYTE*)(&x)+2) - третий байт
*((BYTE*)(&x)+3) - четвертый байт
Go to the top of the page
 
+Quote Post
blackbit
сообщение Apr 4 2007, 10:42
Сообщение #3


Частый гость
**

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



Наложи байтовый массив через union.
Go to the top of the page
 
+Quote Post
Hastja
сообщение Apr 4 2007, 11:31
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 21-11-05
Пользователь №: 11 170



>Наложи байтовый массив через union.
В принципе можно обьеденить одинакового размера две переменные, например
typedef union
{ float f_32; // 32bit
unsigned int i_32; // 32bit
} foo_t;

Будет же что и массив
float x;
*((BYTE*)(&x)) - первый байт
*((BYTE*)(&x)+1) - второй байт
*((BYTE*)(&x)+2) - третий байт
*((BYTE*)(&x)+3) - четвертый байт
Go to the top of the page
 
+Quote Post
DASM
сообщение Apr 4 2007, 11:43
Сообщение #5


Гуру
******

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



зачем на int ?
Код
union
{
float f;
struct
{
  char b0;
  char b1;
  char b2;
  char b3;
};
}
f = 3.14145926;
printf ("%d %d %d %d", b0, b1, b2, b3);
Go to the top of the page
 
+Quote Post
Hastja
сообщение Apr 4 2007, 12:21
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 21-11-05
Пользователь №: 11 170



>зачем на int ?
Если int 32 бита(4 байта), например компилятор IAR, RealView, то
такое:
union {
float f;
struct {
char b0;
char b1;
char b2;
char b3;
};
}

И такеое:
typedef union {
float f;
unsigned int b;
} foo_t;

будут равнозначны.
С массивом функциональнее читается.

Уже работает на AT45 во всю.

Сообщение отредактировал Hastja - Apr 4 2007, 12:27
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 4 2007, 14:46
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Hastja @ Apr 4 2007, 11:21) *
С массивом функциональнее читается.
Тогда возьмите такую реализацию:
Код
union
{
    float f;
    uint8_t char b[sizeof(f)];
};
или
union
{
    float f;
    uint8_t char b[];
};
printf ("%d %d %d %d", b[0], b[1], b[2], b[3]);


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
topkin
сообщение Apr 4 2007, 15:48
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 152
Регистрация: 21-12-05
Из: Москва
Пользователь №: 12 476



"Натяни" на это число байтовый массив через union. Хошь потом по байтам обращайся к переменной, а хочешь к переменной в целом, так будет читабельнее и приятней) ИМХО
Коллеги уже примеры написали, повторяться не буду))
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 4 2007, 19:15
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



memcpy( куда, &MyFloat, sizeof( float) );
Go to the top of the page
 
+Quote Post
Hastja
сообщение Apr 5 2007, 05:40
Сообщение #10


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 21-11-05
Пользователь №: 11 170



Спасибо за советы, и бесценный опыт каждого!
Go to the top of the page
 
+Quote Post

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

 


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


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