ViKo 1 6 февраля, 2018 Опубликовано 6 февраля, 2018 · Жалоба Имею массив из float и указатель на него. pSigRe = SigRe; for (uint32_t i = FFT_N; i--; ) { *pSigRe++ = log2f(*pSigRe) * 15.0515; } При проверке cpp check выдает ошибку. Кратко: Expression '*pSigRe++=log2f(*pSigRe)*15.0515' depends on order of evaluation of side effects Сообщение: Expression '*pSigRe++=log2f(*pSigRe)*15.0515' depends on order of evaluation of side effects Точно, так нельзя писать? :w00t: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 11 6 февраля, 2018 Опубликовано 6 февраля, 2018 · Жалоба Точно, так нельзя писать? :w00t: Мне непонятно, что Вы хотели сказать выражением *pSigRe++ : инкрементировать адрес переменной или получить адрес (попутно инкрементированной) переменной. Во втором случае непонятно назначение правой части присвоения, ведь Вы уже вычислили новое значение переменной pSigRe в левой части? Я думаю, компилятор понимает Вас еще меньше. Расставьте скобки, насильно задав приоритет операций, или перепишите выражение в несколько вычислительных строк. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 февраля, 2018 Опубликовано 6 февраля, 2018 · Жалоба Мне непонятно, что Вы хотели сказать выражением *pSigRe++ : инкрементировать адрес переменной или получить адрес (попутно инкрементированной) переменной. Во втором случае непонятно назначение правой части присвоения, ведь Вы уже вычислили новое значение переменной pSigRe в левой части? Я думаю, компилятор понимает Вас еще меньше. Расставьте скобки, насильно задав приоритет операций, или перепишите выражение в несколько вычислительных строк. Записываю результат по указателю, и инкрементирую его (указатель) для следующей операции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 8 6 февраля, 2018 Опубликовано 6 февраля, 2018 · Жалоба проверьте так pSigRe = SigRe; for (uint32_t i = FFT_N; i--; pSigRe++ ) { *pSigRe = log2f(*pSigRe) * 15.0515; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 6 февраля, 2018 Опубликовано 6 февраля, 2018 · Жалоба олучить адрес (попутно инкрементированной) переменной Это неправильная интерпретация. 2ВиКо Цппчек намекает что постинкремент и вызов фукнции (и соответсвенно вычисление её аргументов) имеет одинаковый приоритет и соответсвенно может произойти в любом порядке, в том числе вначале случится постикремент, а потом уже передача аргументов в функцию. Для общего развития следует прочитать ссылку. Да и в целом сразу бить себя линейкой по пальцам за желание использовать постинкрмент. Его непросто использовать без выстрелов в ногу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 79 6 февраля, 2018 Опубликовано 6 февраля, 2018 · Жалоба Сообщение: Expression '*pSigRe++=log2f(*pSigRe)*15.0515' depends on order of evaluation of side effects Точно, так нельзя писать? :w00t: писать-то можно, только вот результат может оказаться не совсем таким как задумано. Записываю результат по указателю, и инкрементирую его (указатель) для следующей операции. а может всё-таки сначала инкрементируете, потом считаете логарифм уже от следующего элемента, но результат записываете на место предыдущего? на *pSigRe = log2f(*pSigRe++) * 15.0515; ругаться имхо не должен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 февраля, 2018 Опубликовано 6 февраля, 2018 · Жалоба проверьте так pSigRe = SigRe; for (uint32_t i = FFT_N; i--; pSigRe++ ) { *pSigRe = log2f(*pSigRe) * 15.0515; } Чего уж, сделал, чтобы цеплялся: *pSigRe = log2f(*pSigRe) * 15.0515; pSigRe++; Что вы меня все путаете? Сначала справа от = вычисляется, потом присваивается. А инкремент разве не после присваивания должен выполняться? Э, смотрю приоритеты операций. Так присваивание почти на последнем месте. То есть, сначала инкрементируется указатель?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 6 февраля, 2018 Опубликовано 6 февраля, 2018 · Жалоба Кратко: Expression '*pSigRe++=log2f(*pSigRe)*15.0515' depends on order of evaluation of side effects Сообщение: Expression '*pSigRe++=log2f(*pSigRe)*15.0515' depends on order of evaluation of side effects Это вопрос по существу или викторина? Если первое, то следует указывать типы используемых переменных. Мне непонятно, что Вы хотели сказать выражением *pSigRe++ Это называется "пост-инкрементная адресация". Все сишные компиляторы должны понимать её без проблем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 февраля, 2018 Опубликовано 6 февраля, 2018 · Жалоба Это вопрос по существу или викторина? Если первое, то следует указывать типы используемых переменных. Вы первые строки в сообщениях принципиально пропускаете? :rolleyes: Да и какая разница, что за тип? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 6 февраля, 2018 Опубликовано 6 февраля, 2018 · Жалоба на *pSigRe = log2f(*pSigRe++) * 15.0515; ругаться имхо не должен. Нет, необязательно. Вообще нужно просто взять за правило, что если в пределах одного выражения разыменование указателя встречается более одного раза, то никакие пре- или пост- инкрементные или декрементные адресации использовать нельзя. Вы первые строки в сообщениях принципиально пропускаете? :rolleyes: Да и какая разница, что за тип? Из первых строк сообщения можно только сделать вывод что где-то у Вас есть некий массив float и есть некий указатель на него. Больше оттуда нельзя получить никакой информации. Значит всё-таки викторина.... Видимо Вы и программы так пишете - предоставляете компилятору право гадать, что вы хотели написать. Ну естественно и результат закономерный :laughing: Далее включаю экстрасенсорные способности и прикидываю - о каком указателе речь? Может это: float volatile *pSigRe ? а может: float *pSigRe ? а может ещё что...? B) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 февраля, 2018 Опубликовано 6 февраля, 2018 · Жалоба Из первых строк сообщения можно только сделать вывод что где-то у Вас есть некий массив float и есть некий указатель на него. Больше оттуда нельзя получить никакой информации. Значит всё-таки викторина.... Ну, раз нельзя, тогда пусть викторина. :laughing: По существу. У классиков K&R имеется пример, которым, собственно и пользуюсь (руководствуюсь) издавна. /* strcpy: копирует t в s; версия 3 (с указателями) */ void strcpy(char *s, char *t) { while (*s++ = *t++) ; } Считаю, CppCheck пугает химерами зря. jcxz, вам - персонально: static float SigRe[FFT_N] __attribute((section("extram"))); float *pSigRe; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 6 февраля, 2018 Опубликовано 6 февраля, 2018 · Жалоба По существу. У классиков K&R имеется пример, которым, собственно и пользуюсь издавна. ... И...? Каким боком он сюда относится? jcxz, вам - персонально: Спасибо :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 февраля, 2018 Опубликовано 6 февраля, 2018 · Жалоба И...? Каким боком он сюда относится? Вы прикалываетесь, что ли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 6 февраля, 2018 Опубликовано 6 февраля, 2018 · Жалоба Вы прикалываетесь, что ли? Нет. Не понимаю каким боком относится приведённый пример к Вашему вопросу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 февраля, 2018 Опубликовано 6 февраля, 2018 · Жалоба Ладно. Значит, нужно найти точное толкование, когда инкрементируется указатель, если он используется справа и слева от оператора присваивания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться