Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: sscanf и uint8_t
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
toweroff
Добрый день!

есть строка: "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 переменные, а потом переприсваивать... некошерно...

Сергей Борщ
Цитата(toweroff @ Oct 19 2015, 15:08) *
сканить в int переменные, а потом переприсваивать... некошерно...
И тем не менее надо делать именно так. Или не использовать (s)scanf.
toweroff
Цитата(Сергей Борщ @ 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

буду подумать дальше

zltigo
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 , иногда, но редко. Хотя разборка командных строк и конфигураций есть постоянное занятие.
CrimsonPig
Цитата(zltigo @ Oct 19 2015, 14:01) *
Хотя, как нефиг делать и без всяких atoi/atol... по этой причине scanf() наверное никогда в жизни не использовал, ну а atoi , иногда, но редко. Хотя разборка командных строк и конфигураций есть постоянное занятие.


Да ладно.. если бы ТС не пытался экономить битики и говнокодить, то самый простой подход сработал бы:
int i1,i2,i3
sscanf(KStr, "%2d%2d.%d", &i1, &i2, &i3);

Проблема в том, что будет, если исходная строка не будет соответствовать ожидаемому паттерну ? sm.gif
Ну, например, придет что-то типа "-10.7QQ25";
Или надеяться, как [...]кодер из соседнего топика, что "за 2 года буфер не переполнится, а там что-нибудь решим" sm.gif
toweroff
CrimsonPig, строки всегда соответствуют паттерну, ибо валятся от GPS приемника

а так оно да, Zltigo прав, sscanf в данном случае - зло, потому как, кроме разбора сообщений GPS, больше нигде не используется
выбросил ее, написал свой atoi, у которого есть еще аргумент кол-во разрядов, почти 2КБ от кода отвалилось

Цитата
не пытался экономить битики и говнокодить

потрудитесь объяснить.
Возможно, у Вас все используемые контроллеры с 1МБ флеша и 128КБ оперативки? У меня все значительно меньше и ужимание кода - это жизненная необходимость
Если у Вас наплевательское отношение к размеру используемых ресурсов, то говнокод - это Ваше творение
CrimsonPig
Цитата(toweroff @ Oct 19 2015, 15:01) *
CrimsonPig, строки всегда соответствуют паттерну, ибо валятся от GPS приемника

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


Использование стандартных sscanf, printf и попытки съэкономить пару байт (вы считаете себя умнее хорошего оптимизирующего компилятора ?) это глупо. Если при этом еще и портится стек и делаются попытки запрятать проблемы поглубже с помощью манипуляций над пременными, параметрами sscanf и упаковкой структур - это говнокод.
"валятся от GPS приемника" ну-ну.. а каждая посылка от приемника защищена CRC надо полагать ? или оно общатся по последовательному порту без контроля (а даже если из контролем) четности ?
Данные от гпс модуля никогда не теряются и не могут прийти битыми ? (фирмварь для него же такие же кодеры пишут sm.gif
toweroff
Цитата(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) *
или оно общатся по последовательному порту без контроля (а даже если из контролем) четности ?
Данные от гпс модуля никогда не теряются и не могут прийти битыми ? (фирмварь для него же такие же кодеры пишут sm.gif

без контроля четности, GPS модуль располагается на той же плате в 2см от контроллера
Но, возможно, данные потеряются, возможно - придут неверные. Как это "смутит" atoi?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.