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

 
 
 
Reply to this topicStart new topic
> sscanf и uint8_t, как правильно?
toweroff
сообщение Oct 19 2015, 12:08
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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 переменные, а потом переприсваивать... некошерно...

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 19 2015, 12:29
Сообщение #2


Гуру
******

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



Цитата(toweroff @ Oct 19 2015, 15:08) *
сканить в int переменные, а потом переприсваивать... некошерно...
И тем не менее надо делать именно так. Или не использовать (s)scanf.


--------------------
На любой вопрос даю любой ответ
"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
toweroff
сообщение Oct 19 2015, 12:41
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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

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

Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 19 2015, 13:01
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Oct 19 2015, 13:14
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 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);

Проблема в том, что будет, если исходная строка не будет соответствовать ожидаемому паттерну ? sm.gif
Ну, например, придет что-то типа "-10.7QQ25";
Или надеяться, как [...]кодер из соседнего топика, что "за 2 года буфер не переполнится, а там что-нибудь решим" sm.gif
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 19 2015, 14:01
Сообщение #6


Гуру
******

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



CrimsonPig, строки всегда соответствуют паттерну, ибо валятся от GPS приемника

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

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

потрудитесь объяснить.
Возможно, у Вас все используемые контроллеры с 1МБ флеша и 128КБ оперативки? У меня все значительно меньше и ужимание кода - это жизненная необходимость
Если у Вас наплевательское отношение к размеру используемых ресурсов, то говнокод - это Ваше творение
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Oct 19 2015, 14:12
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 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 надо полагать ? или оно общатся по последовательному порту без контроля (а даже если из контролем) четности ?
Данные от гпс модуля никогда не теряются и не могут прийти битыми ? (фирмварь для него же такие же кодеры пишут sm.gif
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 19 2015, 14:21
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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) *
или оно общатся по последовательному порту без контроля (а даже если из контролем) четности ?
Данные от гпс модуля никогда не теряются и не могут прийти битыми ? (фирмварь для него же такие же кодеры пишут sm.gif

без контроля четности, GPS модуль располагается на той же плате в 2см от контроллера
Но, возможно, данные потеряются, возможно - придут неверные. Как это "смутит" atoi?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 7th August 2025 - 13:46
Рейтинг@Mail.ru


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