Easyelectronics.ru

Электроника для всех
Текущее время: 24 янв 2019, 07:36

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


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


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



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

Зарегистрирован: 06 июн 2011, 10:55
Сообщения: 56
Откуда: Иркутск
Набыдлокодил здесь кусок кода и вот теперь думаю, а правильно ли?
Код:
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
Сообщения: 2548
Откуда: Санкт-Петербург
Без разницы.
Единственное - лично я бы на рефлексе поставил первым условием проверку GsmIsActivated, это дешевле (если false - не надо выполнять strstr). Ну и вообще strstr меня смущает, привычней разбор строк делать как-то иначе...

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


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

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

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

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


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

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


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

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


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

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

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


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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