реклама на сайте
подробности

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
ViKo
сообщение Feb 6 2018, 12:34
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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
Точно, так нельзя писать? w00t.gif
Go to the top of the page
 
+Quote Post
V_G
сообщение Feb 6 2018, 12:56
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(ViKo @ Feb 6 2018, 22:34) *
Точно, так нельзя писать? w00t.gif

Мне непонятно, что Вы хотели сказать выражением *pSigRe++ : инкрементировать адрес переменной или получить адрес (попутно инкрементированной) переменной. Во втором случае непонятно назначение правой части присвоения, ведь Вы уже вычислили новое значение переменной pSigRe в левой части?
Я думаю, компилятор понимает Вас еще меньше. Расставьте скобки, насильно задав приоритет операций, или перепишите выражение в несколько вычислительных строк.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 6 2018, 13:00
Сообщение #3


Универсальный солдатик
******

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



Цитата(V_G @ Feb 6 2018, 15:56) *
Мне непонятно, что Вы хотели сказать выражением *pSigRe++ : инкрементировать адрес переменной или получить адрес (попутно инкрементированной) переменной. Во втором случае непонятно назначение правой части присвоения, ведь Вы уже вычислили новое значение переменной pSigRe в левой части?
Я думаю, компилятор понимает Вас еще меньше. Расставьте скобки, насильно задав приоритет операций, или перепишите выражение в несколько вычислительных строк.

Записываю результат по указателю, и инкрементирую его (указатель) для следующей операции.
Go to the top of the page
 
+Quote Post
megajohn
сообщение Feb 6 2018, 13:18
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



проверьте так
pSigRe = SigRe;
for (uint32_t i = FFT_N; i--; pSigRe++ ) {
*pSigRe = log2f(*pSigRe) * 15.0515;
}


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Feb 6 2018, 13:30
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата
олучить адрес (попутно инкрементированной) переменной

Это неправильная интерпретация.
2ВиКо
Цппчек намекает что постинкремент и вызов фукнции (и соответсвенно вычисление её аргументов) имеет одинаковый приоритет и соответсвенно может произойти в любом порядке, в том числе вначале случится постикремент, а потом уже передача аргументов в функцию.

Для общего развития следует прочитать ссылку. Да и в целом сразу бить себя линейкой по пальцам за желание использовать постинкрмент. Его непросто использовать без выстрелов в ногу.
Go to the top of the page
 
+Quote Post
_pv
сообщение Feb 6 2018, 13:34
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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
Точно, так нельзя писать? w00t.gif

писать-то можно, только вот результат может оказаться не совсем таким как задумано.
Цитата
Записываю результат по указателю, и инкрементирую его (указатель) для следующей операции.

а может всё-таки сначала инкрементируете, потом считаете логарифм уже от следующего элемента, но результат записываете на место предыдущего?

на *pSigRe = log2f(*pSigRe++) * 15.0515; ругаться имхо не должен.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 6 2018, 13:35
Сообщение #7


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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++;


Что вы меня все путаете? Сначала справа от = вычисляется, потом присваивается. А инкремент разве не после присваивания должен выполняться?
Э, смотрю приоритеты операций. Так присваивание почти на последнем месте. То есть, сначала инкрементируется указатель??
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 6 2018, 13:53
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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++

Это называется "пост-инкрементная адресация". Все сишные компиляторы должны понимать её без проблем.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 6 2018, 13:55
Сообщение #9


Универсальный солдатик
******

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



Цитата(jcxz @ Feb 6 2018, 16:53) *
Это вопрос по существу или викторина? Если первое, то следует указывать типы используемых переменных.

Вы первые строки в сообщениях принципиально пропускаете? rolleyes.gif Да и какая разница, что за тип?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 6 2018, 14:00
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(_pv @ Feb 6 2018, 15:34) *
на *pSigRe = log2f(*pSigRe++) * 15.0515; ругаться имхо не должен.

Нет, необязательно.
Вообще нужно просто взять за правило, что если в пределах одного выражения разыменование указателя встречается более одного раза, то никакие пре- или пост- инкрементные или декрементные адресации использовать нельзя.

Цитата(ViKo @ Feb 6 2018, 15:55) *
Вы первые строки в сообщениях принципиально пропускаете? rolleyes.gif Да и какая разница, что за тип?

Из первых строк сообщения можно только сделать вывод что где-то у Вас есть некий массив float и есть некий указатель на него. Больше оттуда нельзя получить никакой информации.
Значит всё-таки викторина....
Видимо Вы и программы так пишете - предоставляете компилятору право гадать, что вы хотели написать. Ну естественно и результат закономерный laughing.gif

Далее включаю экстрасенсорные способности и прикидываю - о каком указателе речь?
Может это: float volatile *pSigRe ?
а может: float *pSigRe ?
а может ещё что...? cool.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 6 2018, 14:08
Сообщение #11


Универсальный солдатик
******

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



Цитата(jcxz @ Feb 6 2018, 17:00) *
Из первых строк сообщения можно только сделать вывод что где-то у Вас есть некий массив float и есть некий указатель на него. Больше оттуда нельзя получить никакой информации.
Значит всё-таки викторина....

Ну, раз нельзя, тогда пусть викторина. laughing.gif

По существу. У классиков 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;
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 6 2018, 14:09
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(ViKo @ Feb 6 2018, 16:06) *
По существу. У классиков K&R имеется пример, которым, собственно и пользуюсь издавна.
...

И...?
Каким боком он сюда относится?

Цитата(ViKo @ Feb 6 2018, 16:08) *
jcxz, вам - персонально:

Спасибо rolleyes.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 6 2018, 14:12
Сообщение #13


Универсальный солдатик
******

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



Цитата(jcxz @ Feb 6 2018, 17:09) *
И...?
Каким боком он сюда относится?

Вы прикалываетесь, что ли? biggrin.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 6 2018, 14:19
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(ViKo @ Feb 6 2018, 16:12) *
Вы прикалываетесь, что ли? biggrin.gif

Нет. Не понимаю каким боком относится приведённый пример к Вашему вопросу.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 6 2018, 14:22
Сообщение #15


Универсальный солдатик
******

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



Ладно. Значит, нужно найти точное толкование, когда инкрементируется указатель, если он используется справа и слева от оператора присваивания.
Go to the top of the page
 
+Quote Post

5 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 15:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.0155 секунд с 7
ELECTRONIX ©2004-2016