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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> STM32F429: ошибка преобразования uint32_t в float
skripach
сообщение Feb 4 2016, 13:53
Сообщение #16


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Цитата(Непомнящий Евгений @ Feb 4 2016, 16:32) *
Стесняюсь спросить, а зачем тут union?

Не стесняйтесь, спрашивайте. ТС хочет писать в епром float, union поможет ему это сделать, я вот даже любезно подыскал исходничек.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Feb 4 2016, 14:15
Сообщение #17


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(skripach @ Feb 4 2016, 17:53) *
Не стесняйтесь, спрашивайте. ТС хочет писать в епром float, union поможет ему это сделать, я вот даже любезно подыскал исходничек.


Кастингом тоже можно. С union можно напороться на разницу в длине (я не о данном случае, а вообше), а делая кастинг на байтовый указатель, приходится явно указывать длину.

Поделюсь одним своим приемом.

Мне, пока не придумал как все возложить на компилятор, всегда приходилось строить таблицы адресов, по которым в EEPROM хранятся разные параметры.
Вот техника как избежать этого.

1. Объявляется тип структура, которая содержит все поля для записи в EEPROM.
2. Создается указатель типа этой структуры, который равен нулю.
3. Адрес поля структуры является адресом, по которому надо писать в EEPROM. Длина типа поля (или поля структуры) равна количеству байт для записи.

Все просто и легко модифицируемо. Функция записи в EEPROM не заморачивается с другими типами кроме однобайтовых.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 4 2016, 14:21
Сообщение #18


Гуру
******

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



Цитата(Tarbal @ Feb 4 2016, 16:15) *
Кастингом тоже можно.
Это когда толпа теток в нижнем белье и без?


--------------------
На любой вопрос даю любой ответ
"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
Непомнящий Евген...
сообщение Feb 4 2016, 14:36
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(skripach @ Feb 4 2016, 16:53) *
Не стесняйтесь, спрашивайте. ТС хочет писать в епром float, union поможет ему это сделать, я вот даже любезно подыскал исходничек.


Оно конечно можно по всякому, но по вашей же ссылке

Цитата
The simplest way is just to treat it as a buffer.
Код
float x;
i2c.write(addr, (char*)&x, sizeof(x));
...
i2c.read(addr, (char*)&x, sizeof(x));
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Feb 4 2016, 14:38
Сообщение #20


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Сергей Борщ @ Feb 4 2016, 18:21) *
Это когда толпа теток в нижнем белье и без?


В белье -- это не наш метод. Только без.
Go to the top of the page
 
+Quote Post
skripach
сообщение Feb 4 2016, 15:19
Сообщение #21


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Цитата(Непомнящий Евгений @ Feb 4 2016, 17:36) *
Оно конечно можно по всякому, но по вашей же ссылке

и?
Очевидно ТС не силён в указателях, я предложил решение, на мой взгляд более правильное чем указатели.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 4 2016, 15:23
Сообщение #22


Гуру
******

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



Цитата(Непомнящий Евгений @ Feb 4 2016, 16:36) *
но по вашей же ссылке
За приведение адреса двоичных (не текстовых!) данных к указателю на char бить линейкой по рукам. Есть uint8_t в stdint.h, для поборников чистоты C89 есть unsigned char.


--------------------
На любой вопрос даю любой ответ
"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
Tarbal
сообщение Feb 4 2016, 15:55
Сообщение #23


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(skripach @ Feb 4 2016, 19:19) *
и?
Очевидно ТС не силён в указателях, я предложил решение, на мой взгляд более правильное чем указатели.


Не более правильное, а альтернативное. Кастинг типов кстати используют чаще чем union в подобных случаях.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 4 2016, 16:47
Сообщение #24


Гуру
******

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



Цитата(Tarbal @ Feb 4 2016, 17:55) *
Кастинг типов кстати используют
Вот объясните, почему кастинг используют, а приведение типов не юзают?


--------------------
На любой вопрос даю любой ответ
"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
Tarbal
сообщение Feb 4 2016, 17:23
Сообщение #25


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Сергей Борщ @ Feb 4 2016, 19:47) *
Вот объясните, почему кастинг используют, а приведение типов не юзают?


Я все это больше 20 лет по-английски только называю. Так что не все термины помню. Извините если режет слух. Самое шедевральное из русского магазина в Америке:
"Вам сыр писом или послайсать?"
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Feb 5 2016, 05:11
Сообщение #26


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(Сергей Борщ @ Feb 4 2016, 18:23) *
За приведение адреса двоичных (не текстовых!) данных к указателю на char бить линейкой по рукам. Есть uint8_t в stdint.h, для поборников чистоты C89 есть unsigned char.


По хорошему все подобные функции должны получать void*. Но почему-то многие пишут их так, что они получают char*. В Си по моему работает неявное приведение, а вот в плюсах приходится писать явно.

Цитата(skripach @ Feb 4 2016, 18:19) *
и?
Очевидно ТС не силён в указателях, я предложил решение, на мой взгляд более правильное чем указатели.


Ну если ТС хочет МК и Си, то с указателями таки надо бы разобраться... Ну и насчет правильности можно поспорить. Это же Си, тут операции с указателями - не грязный хак, а основа основ
Go to the top of the page
 
+Quote Post
Alechek
сообщение Feb 5 2016, 06:15
Сообщение #27


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

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(Непомнящий Евгений @ Feb 5 2016, 10:11) *
По хорошему все подобные функции должны получать void*. Но почему-то многие пишут их так, что они получают char*. В Си по моему работает неявное приведение, а вот в плюсах приходится писать явно.

Именно! в пример - memcpy. Копирует что угодно и сколько угодно, но с размером в байтах. Сам когда-то на заре принмал входящие данные в char*. Давно отказался.
Всякие char, uint8_t и прочее однобайтовое - лишь чтобы статически заререзвировать буфер на этапе компиляции под пока неизвестные данные.
Go to the top of the page
 
+Quote Post
skripach
сообщение Feb 5 2016, 06:50
Сообщение #28


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Цитата(Непомнящий Евгений @ Feb 5 2016, 08:11) *
Ну если ТС хочет МК и Си, то с указателями таки надо бы разобраться... Ну и насчет правильности можно поспорить.

Спорить не надо, потому что это только моё мнение и я не утверждаю что это абсолютная истина.
Цитата
на мой взгляд более правильное


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 5 2016, 07:33
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Tarbal @ Feb 4 2016, 20:23) *
Я все это больше 20 лет по-английски только называю.

Граммар наци негодуэ. Тогда уж "тайп каст". Или "кэст" - на мериканский манер. Или вообще "type cast" - буковки-то на клавиатуре присутствуют smile3009.gif
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Feb 5 2016, 12:05
Сообщение #30


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(scifi @ Feb 5 2016, 11:33) *
Граммар наци негодуэ. Тогда уж "тайп каст". Или "кэст" - на мериканский манер. Или вообще "type cast" - буковки-то на клавиатуре присутствуют smile3009.gif


Дык уже сказали как правильно. Я кстати учил по-русски, но это еще в СССР было. Забыл.
Go to the top of the page
 
+Quote Post

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

 


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


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