Easyelectronics.ru

Электроника для всех
Текущее время: 20 мар 2019, 10:35

Часовой пояс: UTC + 5 часов


Правила форума


Входить исключительно со своей туалетной бумагой. Можно невозбранно получить по голове за быдляк и личные наезды.



Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Так же нельзя делать, правильно?
СообщениеДобавлено: 02 июл 2018, 10:05 
Заглядывает иногда

Зарегистрирован: 06 июн 2011, 10:55
Сообщения: 62
Откуда: Иркутск
Набыдлокодил здесь кусок кода и вот теперь думаю, а правильно ли?
Код:
vHeater.GsmIsActivated = true;
...
...
if(strstr(vGSM.rx_SMSbuf,"#Change")&&vHeater.GsmIsActivated){...}

Вроде как работает, но если подумать данная функция возвращает указатель и существует не иллюзорный шанс, того, что "if" не выполнится хотя искомая строка в массиве будет присутствовать.
Или правильнее написать:
Код:
if((strstr(vGSM.rx_SMSbuf,"#Change")!=NULL)&&vHeater.GsmIsActivated){...}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Так же нельзя делать, правильно?
СообщениеДобавлено: 02 июл 2018, 10:58 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2563
Откуда: Санкт-Петербург
Без разницы.
Единственное - лично я бы на рефлексе поставил первым условием проверку GsmIsActivated, это дешевле (если false - не надо выполнять strstr). Ну и вообще strstr меня смущает, привычней разбор строк делать как-то иначе...

Или приёмный буфер - не обязательно null-terminated string (в середине буфера может встретиться нулевой байт)? Тогда strstr вообще не годится, но оба варианта всё равно эквивалентны.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Так же нельзя делать, правильно?
СообщениеДобавлено: 02 июл 2018, 11:11 
Заглядывает иногда

Зарегистрирован: 06 июн 2011, 10:55
Сообщения: 62
Откуда: Иркутск
aamonster писал(а):
Без разницы.
Единственное - лично я бы на рефлексе поставил первым условием проверку GsmIsActivated

Дельное замечание, спасибо, поправлю.

aamonster писал(а):
Или приёмный буфер - не обязательно null-terminated string (в середине буфера может встретиться нулевой байт)? Тогда strstr вообще не годится, но оба варианта всё равно эквивалентны.


Я почему и задался этим вопросом, т.к. программа работает день-два. потом перестаёт выполняться код, который указан в этом "if". Вот и думаю, что в условии есть какие-то камни которые я с ходу не заметил.

Другой вариант решения - заменить strstr на тупое побайтовое сравнение. Да, читаемость кода скатится в ад. Но надёжность и конечные размеры hex будут меньше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Так же нельзя делать, правильно?
СообщениеДобавлено: 02 июл 2018, 11:25 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2752
побайтовое сравнение тогда уж заменить memcmp. У себя в парсере использовал strncmp, явно задавая конечную длину. Там где есть вероятность строки без нуля в конце использовать стандартные функции вообще нельзя - неизвестно где после строки встретится ноль, и хорошо если в hardfault не улетим.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Так же нельзя делать, правильно?
СообщениеДобавлено: 02 июл 2018, 15:05 
Заглядывает иногда

Зарегистрирован: 06 июн 2011, 10:55
Сообщения: 62
Откуда: Иркутск
Hold писал(а):
побайтовое сравнение тогда уж заменить memcmp. У себя в парсере использовал strncmp, явно задавая конечную длину.

Для меня главное - размеры, которые функция будет отжирать от RAM && Flash. Если memcmp || strncmp позволят сэкономить, думаю применить их будет можно взамен strstr.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: igarr


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB