|
|
  |
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, 12:41
|

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

|
Цитата(Сергей Борщ @ Oct 19 2015, 15:29)  И тем не менее надо делать именно так. Или не использовать (s)scanf. и, все-таки, можно. Вот так: Код sscanf(token_buf, "%02hhd%02hhd.%hd", ... т.е. последовательно снижаем разрядность от int до short int и char На всякий случай - ARMCC 5.06 build 20 однако, это не спасает от точки и __packed или не упакованная структура, или hard fault буду подумать дальше
|
|
|
|
|
Oct 19 2015, 13:01
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (toweroff @ Oct 19 2015, 15:08)  есть строка: "3150.7825" нужно выделить из нее 31, 50 и 7825 atoi(string)/100; atoi(string)%100; atoi(string+5); Хотя, как нефиг делать и без всяких atoi/atol... по этой причине scanf() наверное никогда в жизни не использовал, ну а atoi , иногда, но редко. Хотя разборка командных строк и конфигураций есть постоянное занятие.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 19 2015, 13:14
|

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

|
Цитата(zltigo @ Oct 19 2015, 14:01)  Хотя, как нефиг делать и без всяких atoi/atol... по этой причине scanf() наверное никогда в жизни не использовал, ну а atoi , иногда, но редко. Хотя разборка командных строк и конфигураций есть постоянное занятие. Да ладно.. если бы ТС не пытался экономить битики и говнокодить, то самый простой подход сработал бы: int i1,i2,i3 sscanf(KStr, "%2d%2d.%d", &i1, &i2, &i3); Проблема в том, что будет, если исходная строка не будет соответствовать ожидаемому паттерну ? Ну, например, придет что-то типа "-10.7QQ25"; Или надеяться, как [...]кодер из соседнего топика, что "за 2 года буфер не переполнится, а там что-нибудь решим"
|
|
|
|
|
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?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|