|
|
  |
STM32F429: ошибка преобразования uint32_t в float |
|
|
|
Feb 4 2016, 13:53
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Цитата(Непомнящий Евгений @ Feb 4 2016, 16:32)  Стесняюсь спросить, а зачем тут union? Не стесняйтесь, спрашивайте. ТС хочет писать в епром float, union поможет ему это сделать, я вот даже любезно подыскал исходничек.
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Feb 4 2016, 14:15
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(skripach @ Feb 4 2016, 17:53)  Не стесняйтесь, спрашивайте. ТС хочет писать в епром float, union поможет ему это сделать, я вот даже любезно подыскал исходничек. Кастингом тоже можно. С union можно напороться на разницу в длине (я не о данном случае, а вообше), а делая кастинг на байтовый указатель, приходится явно указывать длину. Поделюсь одним своим приемом. Мне, пока не придумал как все возложить на компилятор, всегда приходилось строить таблицы адресов, по которым в EEPROM хранятся разные параметры. Вот техника как избежать этого. 1. Объявляется тип структура, которая содержит все поля для записи в EEPROM. 2. Создается указатель типа этой структуры, который равен нулю. 3. Адрес поля структуры является адресом, по которому надо писать в EEPROM. Длина типа поля (или поля структуры) равна количеству байт для записи. Все просто и легко модифицируемо. Функция записи в EEPROM не заморачивается с другими типами кроме однобайтовых.
|
|
|
|
|
Feb 4 2016, 14:36
|
Знающий
   
Группа: Свой
Сообщений: 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));
|
|
|
|
|
Feb 4 2016, 15:19
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Цитата(Непомнящий Евгений @ Feb 4 2016, 17:36)  Оно конечно можно по всякому, но по вашей же ссылке и? Очевидно ТС не силён в указателях, я предложил решение, на мой взгляд более правильное чем указатели.
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Feb 5 2016, 05:11
|
Знающий
   
Группа: Свой
Сообщений: 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)  и? Очевидно ТС не силён в указателях, я предложил решение, на мой взгляд более правильное чем указатели. Ну если ТС хочет МК и Си, то с указателями таки надо бы разобраться... Ну и насчет правильности можно поспорить. Это же Си, тут операции с указателями - не грязный хак, а основа основ
|
|
|
|
|
Feb 5 2016, 06:15
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(Непомнящий Евгений @ Feb 5 2016, 10:11)  По хорошему все подобные функции должны получать void*. Но почему-то многие пишут их так, что они получают char*. В Си по моему работает неявное приведение, а вот в плюсах приходится писать явно. Именно! в пример - memcpy. Копирует что угодно и сколько угодно, но с размером в байтах. Сам когда-то на заре принмал входящие данные в char*. Давно отказался. Всякие char, uint8_t и прочее однобайтовое - лишь чтобы статически заререзвировать буфер на этапе компиляции под пока неизвестные данные.
|
|
|
|
|
Feb 5 2016, 06:50
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

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