jenya7 0 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба Есть такая строчка в коде for (i=0; i < size_to_take; i++) { DataBuffer[i] = (data_out[j++]<<8) | data_out[j++]; } Выскакивает предупреждение Warning[Pa079]: undefined behavior: variable "j" (declared at line 176) (or a value reached by some form of indirection through it) is modified more than once without an interveningВ GCC компайлере такого предупреждения нет.Что надо переделать чтоб предупреждение исчезло? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба j++ два раза в одном выражении - это бяка. Результат выражения не определён. Не надо так делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 5 июня, 2018 Опубликовано 5 июня, 2018 (изменено) · Жалоба j++ два раза в одном выражении - это бяка. Результат выражения не определён. Не надо так делать. у меня тут выбора особо нету :( если только так DataBuffer[i] = (data_out[j++]<<8); DataBuffer[i] |= data_out[j++]; по моему так еще уродливей Изменено 5 июня, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба j++ два раза в одном выражении - это бяка. Результат выражения не определён. Не надо так делать. Не результат выражения, а порядок операций. а делать так действительно не надо. Чем меньше неоднозначностей в коде, тем лучше. Ещё рекомендую статический анализатор запускать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба по моему так еще уродливей Что мешает сделать так: DataBuffer[i] = (data_out[j] << 8) | data_out[j + 1]; j += 2; ??? И дело не в уродливости, а в корректности. Оригинальный код некорректен, слава яру и его предупреждениям. Не результат выражения, а порядок операций. То есть вы утверждаете, что результат определён? Какое смелое заявление. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 17 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба То есть вы утверждаете, что результат определён? Какое смелое заявление. Какое смелое передёргивание. Рискну предположить, что стандарт не говорит о результате. Он говорит о порядке операций. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба То есть вы утверждаете, что результат определён? Какое смелое заявление. В данном случае нет, но такое предупреждение бывает, например, при операциях с несколькими волатильными переменными Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба Рискну предположить, что стандарт не говорит о результате. Он говорит о порядке операций. Неверное предположение. Конечно, стандарт говорит о результате, иначе зачем он нужен? Результат складывается из последовательности операций, и если порядок операций не определён, то и результат не определён. Очевидно же! В данном случае нет, но такое предупреждение бывает, например, при операциях с несколькими волатильными переменными Угу. :beer: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба А вот же похожая тема. Только в ней инкремент с другой стороны относительно = https://electronix.ru/forum/index.php?showt...650&hl=ViKo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба Что мешает сделать так: DataBuffer[i] = (data_out[j] << 8) | data_out[j + 1]; j += 2; ??? И дело не в уродливости, а в корректности. Оригинальный код некорректен, слава яру и его предупреждениям. То есть вы утверждаете, что результат определён? Какое смелое заявление. на этом варианте остановлюсь. спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба DataBuffer[i] = (data_out[j++]<<8) | data_out[j++]; похоже на пример из статей "Как писать неподдерживаемый код". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 17 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба Неверное предположение. Конечно, стандарт говорит о результате, иначе зачем он нужен? The grouping of operators and operands is indicated by the syntax.71) Except as specified later (for the function-call (), &&, ||, ?:, and comma operators), the order of evaluation of subexpressions and the order in which side effects take place are both unspecified.Оно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба Оно?Оно самое. Тему можно переименовать из "странное предупреждение" в "странная реакция на предупреждение" :biggrin: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 20 июня, 2018 Опубликовано 20 июня, 2018 · Жалоба Есть такая строчка в кодеfor (i=0; i < size_to_take; i++) { DataBuffer[i] = (data_out[j++]<<8) | data_out[j++]; } если нет перевёртывания с эндианами и DataBuffer - это 16-ти разрядное, то memcpy((void*)DataBuffer, (void*)&data_out[j], 2*size_to_take); j += 2*size_to_take; //если j дальше не нужно, удалить эту строку без ворнингов, безопаснее, и БЫСТРЕЕ. (явное преобразование к воид не обязательно). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 20 июня, 2018 Опубликовано 20 июня, 2018 · Жалоба без ворнингов, безопаснее, и БЫСТРЕЕ. (явное преобразование к воид не обязательно). Большие и малые индейцы негодуэ :crying: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться