Перейти к содержанию
    

Имею массив из 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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Точно, так нельзя писать? :w00t:

Мне непонятно, что Вы хотели сказать выражением *pSigRe++ : инкрементировать адрес переменной или получить адрес (попутно инкрементированной) переменной. Во втором случае непонятно назначение правой части присвоения, ведь Вы уже вычислили новое значение переменной pSigRe в левой части?

Я думаю, компилятор понимает Вас еще меньше. Расставьте скобки, насильно задав приоритет операций, или перепишите выражение в несколько вычислительных строк.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне непонятно, что Вы хотели сказать выражением *pSigRe++ : инкрементировать адрес переменной или получить адрес (попутно инкрементированной) переменной. Во втором случае непонятно назначение правой части присвоения, ведь Вы уже вычислили новое значение переменной pSigRe в левой части?

Я думаю, компилятор понимает Вас еще меньше. Расставьте скобки, насильно задав приоритет операций, или перепишите выражение в несколько вычислительных строк.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Это неправильная интерпретация.

2ВиКо

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

 

Для общего развития следует прочитать ссылку. Да и в целом сразу бить себя линейкой по пальцам за желание использовать постинкрмент. Его непросто использовать без выстрелов в ногу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сообщение: Expression '*pSigRe++=log2f(*pSigRe)*15.0515' depends on order of evaluation of side effects

Точно, так нельзя писать? :w00t:

писать-то можно, только вот результат может оказаться не совсем таким как задумано.

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

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

 

на *pSigRe = log2f(*pSigRe++) * 15.0515; ругаться имхо не должен.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

проверьте так

pSigRe = SigRe;

for (uint32_t i = FFT_N; i--; pSigRe++ ) {

*pSigRe = log2f(*pSigRe) * 15.0515;

}

Чего уж, сделал, чтобы цеплялся:

    *pSigRe = log2f(*pSigRe) * 15.0515;
    pSigRe++;

 

Что вы меня все путаете? Сначала справа от = вычисляется, потом присваивается. А инкремент разве не после присваивания должен выполняться?

Э, смотрю приоритеты операций. Так присваивание почти на последнем месте. То есть, сначала инкрементируется указатель??

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кратко: 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++

Это называется "пост-инкрементная адресация". Все сишные компиляторы должны понимать её без проблем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это вопрос по существу или викторина? Если первое, то следует указывать типы используемых переменных.

Вы первые строки в сообщениях принципиально пропускаете? :rolleyes: Да и какая разница, что за тип?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на *pSigRe = log2f(*pSigRe++) * 15.0515; ругаться имхо не должен.

Нет, необязательно.

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

 

Вы первые строки в сообщениях принципиально пропускаете? :rolleyes: Да и какая разница, что за тип?

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

Значит всё-таки викторина....

Видимо Вы и программы так пишете - предоставляете компилятору право гадать, что вы хотели написать. Ну естественно и результат закономерный :laughing:

 

Далее включаю экстрасенсорные способности и прикидываю - о каком указателе речь?

Может это: float volatile *pSigRe ?

а может: float *pSigRe ?

а может ещё что...? B)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Из первых строк сообщения можно только сделать вывод что где-то у Вас есть некий массив 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По существу. У классиков K&R имеется пример, которым, собственно и пользуюсь издавна.

...

И...?

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

 

jcxz, вам - персонально:

Спасибо :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И...?

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

Вы прикалываетесь, что ли? :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы прикалываетесь, что ли? :biggrin:

Нет. Не понимаю каким боком относится приведённый пример к Вашему вопросу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ладно. Значит, нужно найти точное толкование, когда инкрементируется указатель, если он используется справа и слева от оператора присваивания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

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

×
×
  • Создать...