|
sscanf и uint8_t, как правильно? |
|
|
|
Oct 19 2015, 12:08
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Добрый день! есть строка: "3150.7825" нужно выделить из нее 31, 50 и 7825 есть структура: Код typedef __packed struct { uint8_t lat_gr; uint8_t lat_min; uint16_t lat_secs; } GPS_info_t; как правильно записать строку форматов? Пока вот с таким вариантом (там пробел вместо точки, если точка - в hard fault сразу) Код sscanf(token_buf, "%02c%02c %hd", &GPS_temp_data.lat_gr, &GPS_temp_data.lat_min, &GPS_temp_data.lat_secs); считывается просто код символа, т.е. lat_gr = '3' lat_min = '5' lat_secs = '0' при таком - вываливаемся в hard fault Код sscanf(token_buf, "%02d%02d %hd", &GPS_temp_data.lat_gr, &GPS_temp_data.lat_min, &GPS_temp_data.lat_secs); сканить в int переменные, а потом переприсваивать... некошерно...
|
|
|
|
|
 |
Ответов
|
Oct 19 2015, 14:01
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
CrimsonPig, строки всегда соответствуют паттерну, ибо валятся от GPS приемника а так оно да, Zltigo прав, sscanf в данном случае - зло, потому как, кроме разбора сообщений GPS, больше нигде не используется выбросил ее, написал свой atoi, у которого есть еще аргумент кол-во разрядов, почти 2КБ от кода отвалилось Цитата не пытался экономить битики и говнокодить потрудитесь объяснить. Возможно, у Вас все используемые контроллеры с 1МБ флеша и 128КБ оперативки? У меня все значительно меньше и ужимание кода - это жизненная необходимость Если у Вас наплевательское отношение к размеру используемых ресурсов, то говнокод - это Ваше творение
|
|
|
|
|
Oct 19 2015, 14:12
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(toweroff @ Oct 19 2015, 15:01)  CrimsonPig, строки всегда соответствуют паттерну, ибо валятся от GPS приемника
а так оно да, Zltigo прав, sscanf в данном случае - зло, потому как, кроме разбора сообщений GPS, больше нигде не используется выбросил ее, написал свой atoi, у которого есть еще аргумент кол-во разрядов, почти 2КБ от кода отвалилось отрудитесь объяснить. Возможно, у Вас все используемые контроллеры с 1МБ флеша и 128КБ оперативки? У меня все значительно меньше и ужимание кода - это жизненная необходимость Если у Вас наплевательское отношение к размеру используемых ресурсов, то говнокод - это Ваше творение Использование стандартных sscanf, printf и попытки съэкономить пару байт (вы считаете себя умнее хорошего оптимизирующего компилятора ?) это глупо. Если при этом еще и портится стек и делаются попытки запрятать проблемы поглубже с помощью манипуляций над пременными, параметрами sscanf и упаковкой структур - это говнокод. "валятся от GPS приемника" ну-ну.. а каждая посылка от приемника защищена CRC надо полагать ? или оно общатся по последовательному порту без контроля (а даже если из контролем) четности ? Данные от гпс модуля никогда не теряются и не могут прийти битыми ? (фирмварь для него же такие же кодеры пишут
|
|
|
|
|
Oct 19 2015, 14:21
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(CrimsonPig @ Oct 19 2015, 17:12)  Использование стандартных sscanf, printf и попытки съэкономить пару байт (вы считаете себя умнее хорошего оптимизирующего компилятора ?) это глупо. Если при этом еще и портится стек и делаются попытки запрятать проблемы поглубже с помощью манипуляций над пременными, параметрами sscanf и упаковкой структур - это говнокод. я говорю про данный конкретный случайи таки да, printf без поддержки float и отсутствие необходимости в sscanf освободили порядка 5КБ флеша из 32КБ Цитата(CrimsonPig @ Oct 19 2015, 17:12)  "валятся от GPS приемника" ну-ну.. а каждая посылка от приемника защищена CRC надо полагать ? не поверите. NMEA 0183 подразумевает контрольную сумму в конце пакета Цитата(CrimsonPig @ Oct 19 2015, 17:12)  или оно общатся по последовательному порту без контроля (а даже если из контролем) четности ? Данные от гпс модуля никогда не теряются и не могут прийти битыми ? (фирмварь для него же такие же кодеры пишут  без контроля четности, GPS модуль располагается на той же плате в 2см от контроллера Но, возможно, данные потеряются, возможно - придут неверные. Как это "смутит" atoi?
|
|
|
|
Сообщений в этой теме
toweroff sscanf и uint8_t Oct 19 2015, 12:08 Сергей Борщ Цитата(toweroff @ Oct 19 2015, 15:08) ска... Oct 19 2015, 12:29 toweroff Цитата(Сергей Борщ @ Oct 19 2015, 15:29) ... Oct 19 2015, 12:41 zltigo QUOTE (toweroff @ Oct 19 2015, 15:08) ест... Oct 19 2015, 13:01 CrimsonPig Цитата(zltigo @ Oct 19 2015, 14:01) Хотя,... Oct 19 2015, 13:14
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|