|
|
  |
Cpp check ругается, можно ли так писать? |
|
|
|
Feb 6 2018, 12:34
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Имею массив из 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 Точно, так нельзя писать?
|
|
|
|
|
Feb 6 2018, 13:30
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата олучить адрес (попутно инкрементированной) переменной Это неправильная интерпретация. 2ВиКо Цппчек намекает что постинкремент и вызов фукнции (и соответсвенно вычисление её аргументов) имеет одинаковый приоритет и соответсвенно может произойти в любом порядке, в том числе вначале случится постикремент, а потом уже передача аргументов в функцию. Для общего развития следует прочитать ссылку. Да и в целом сразу бить себя линейкой по пальцам за желание использовать постинкрмент. Его непросто использовать без выстрелов в ногу.
|
|
|
|
|
Feb 6 2018, 13:34
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(ViKo @ Feb 6 2018, 19:34)  Сообщение: Expression '*pSigRe++=log2f(*pSigRe)*15.0515' depends on order of evaluation of side effects Точно, так нельзя писать?  писать-то можно, только вот результат может оказаться не совсем таким как задумано. Цитата Записываю результат по указателю, и инкрементирую его (указатель) для следующей операции. а может всё-таки сначала инкрементируете, потом считаете логарифм уже от следующего элемента, но результат записываете на место предыдущего? на *pSigRe = log2f(*pSigRe++) * 15.0515; ругаться имхо не должен.
|
|
|
|
|
Feb 6 2018, 13:35
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(megajohn @ Feb 6 2018, 16:18)  проверьте так pSigRe = SigRe; for (uint32_t i = FFT_N; i--; pSigRe++ ) { *pSigRe = log2f(*pSigRe) * 15.0515; } Чего уж, сделал, чтобы цеплялся: Код *pSigRe = log2f(*pSigRe) * 15.0515; pSigRe++; Что вы меня все путаете? Сначала справа от = вычисляется, потом присваивается. А инкремент разве не после присваивания должен выполняться? Э, смотрю приоритеты операций. Так присваивание почти на последнем месте. То есть, сначала инкрементируется указатель??
|
|
|
|
|
Feb 6 2018, 13:53
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(ViKo @ Feb 6 2018, 14:34)  Кратко: 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 Это вопрос по существу или викторина? Если первое, то следует указывать типы используемых переменных. Цитата(V_G @ Feb 6 2018, 14:56)  Мне непонятно, что Вы хотели сказать выражением *pSigRe++ Это называется "пост-инкрементная адресация". Все сишные компиляторы должны понимать её без проблем.
|
|
|
|
|
Feb 6 2018, 14:00
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(_pv @ Feb 6 2018, 15:34)  на *pSigRe = log2f(*pSigRe++) * 15.0515; ругаться имхо не должен. Нет, необязательно. Вообще нужно просто взять за правило, что если в пределах одного выражения разыменование указателя встречается более одного раза, то никакие пре- или пост- инкрементные или декрементные адресации использовать нельзя. Цитата(ViKo @ Feb 6 2018, 15:55)  Вы первые строки в сообщениях принципиально пропускаете?  Да и какая разница, что за тип? Из первых строк сообщения можно только сделать вывод что где-то у Вас есть некий массив float и есть некий указатель на него. Больше оттуда нельзя получить никакой информации. Значит всё-таки викторина.... Видимо Вы и программы так пишете - предоставляете компилятору право гадать, что вы хотели написать. Ну естественно и результат закономерный Далее включаю экстрасенсорные способности и прикидываю - о каком указателе речь? Может это: float volatile *pSigRe ? а может: float *pSigRe ? а может ещё что...?
|
|
|
|
|
Feb 6 2018, 14:08
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(jcxz @ Feb 6 2018, 17:00)  Из первых строк сообщения можно только сделать вывод что где-то у Вас есть некий массив float и есть некий указатель на него. Больше оттуда нельзя получить никакой информации. Значит всё-таки викторина.... Ну, раз нельзя, тогда пусть викторина. По существу. У классиков 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;
|
|
|
|
|
Feb 6 2018, 14:09
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(ViKo @ Feb 6 2018, 16:06)  По существу. У классиков K&R имеется пример, которым, собственно и пользуюсь издавна. ... И...? Каким боком он сюда относится? Цитата(ViKo @ Feb 6 2018, 16:08)  jcxz, вам - персонально: Спасибо
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|