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

А если вдруг запустит на двух- и более процессорном кристалле ?

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


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

Должно выполняться по порядку:

1. (*pSigRe)

2. log2f()

3. pSigRe++

4. *pSigRe

5. умножение

6. присвоение.

ИМХО так делать можно, компилятор не должен ругаться.

Компилятор может и не будет ругаться (а зря), однако так делать нельзя. Причины озвучены выше.

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


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

Хорошо вас тут читать.. но.. мое мнение если можно "«Бывает ли у вас такие ситуации, когда слово, идиома или грамматическая конструкция иностранного языка никак не могут удержаться в голове, несмотря на то, что вы встречали её уже много раз и даже специально учили? А сколько процентов иностранных слов вы помните спустя месяц после их изучения? А спустя полгода? Сложно ли вам мотивировать себя на занятия иностранным языком?»

У меня на эти вопросы возникает только другой вопрос: А так ли оно мне надо, если я пользуюсь этими словами раз в пол года? Я лично против забивания мозга тем, что мне не сильно то и нужно."

как-то так примерно. Давно перестал запоминать все эти правила и стараться " типа красиво, в одну строку все". Мой код стал похож на "новичка" - разделяю все на строки не длиннее 80 символов (исключение - список инициализации конструктора), ставлю скобки где и не нужны. Зато не надо вспоминать 14 приоритетов и думать о sequnce point. Ну кто как хочет, только потом обычно с кодом разбираться самому и придется, и материть тоже самого себя. С cppreferencr.com тоже могу "офигенно красиво" написать, только вот потом подзабывается все это. Ну ладно, сорри что встрял в ученую беседу

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


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

Я лично против забивания мозга тем, что мне не сильно то и нужно."

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

Трудно Вам придётся когда надо будет поработать в команде с другими программёрами. ...у которых свои понятия.

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


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

Хорошо вас тут читать.. но.. мое мнение если можно "«Бывает ли у вас такие ситуации, когда слово, идиома или грамматическая конструкция иностранного языка никак не могут удержаться в голове, несмотря на то, что вы встречали её уже много раз и даже специально учили? А сколько процентов иностранных слов вы помните спустя месяц после их изучения? А спустя полгода? Сложно ли вам мотивировать себя на занятия иностранным языком?»

У меня на эти вопросы возникает только другой вопрос: А так ли оно мне надо, если я пользуюсь этими словами раз в пол года? Я лично против забивания мозга тем, что мне не сильно то и нужно."

как-то так примерно. Давно перестал запоминать все эти правила и стараться " типа красиво, в одну строку все". Мой код стал похож на "новичка" - разделяю все на строки не длиннее 80 символов (исключение - список инициализации конструктора), ставлю скобки где и не нужны. Зато не надо вспоминать 14 приоритетов и думать о sequnce point. Ну кто как хочет, только потом обычно с кодом разбираться самому и придется, и материть тоже самого себя. С cppreferencr.com тоже могу "офигенно красиво" написать, только вот потом подзабывается все это. Ну ладно, сорри что встрял в ученую беседу

Я тоже пишу максимально просто и без лишней головной боли.

Просто понимаю, какие конструкции к чему могут привести с точки зрения стандарта языка. А чтобы это начать понимать, пришлось не одну ложку дегтя съесть в других проекта)))

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


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

Имеем следующее

 

pSigRe = SigRe;

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

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

}

 

Если SigRe это массив, может следует к нему обращаться как к массиву.

 

// pSigRe = SigRe;

j=0;

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

SigRe[j] = log2f(SigRe[j]) * 15.0515;

j++;

}

 

Стараюсь глубоко не разбираться в идиомах различных компиляторов.

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


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

Не считайте упрямством, хочу разобраться. Постинкремент переменной работает после того, как ее использовали. Следовательно, после того, как будет записано вычисленное выражение. Логично?

 

Если SigRe это массив, может следует к нему обращаться как к массиву.

Можно и к массиву. Предполагаю, что для ARM это будет работать так же легко и быстро, как и по указателю. Но я люблю указатели. Деды так завещали.

 

Я думаю, что ViKo никогда ещё не включал оптимизацию. И не заглядывал при этом в асм :biggrin:

Первое высказывание исключает второе. Если учесть, что оба неверные, следует, jcxz = трепач. :biggrin:

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


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

Не считайте упрямством, хочу разобраться. Постинкремент переменной работает после того, как ее использовали. Следовательно, после того, как будет записано вычисленное выражение. Логично?

Нет, не так.

Постинкремент переменной не определён внутри выражения.

Рассмотрим пример:

int m[10];
int i = 0;
m[i++] = i; // неопределенное поведение
m[i] = i++; // неопределенное поведение

По стандарту операция присваивания не является точкой следования, соответственно неизвестно, в каком порядке будут вычислены стороны выражения.

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

1) m[0] = 0; // i == 1
2) m[0] = 1; // i == 1

 

Аналогично и в Вашем случае.

Изменено пользователем Arlleex

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


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

Компилятор использовал следующую команду для записи вычисленного выражения

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

 

STR r0,[r4],#4

Постинкремент

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


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

Компилятор использовал следующую команду для записи вычисленного выражения

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

 

STR r0,[r4],#4

Постинкремент

А окружение этой команды можно привести? До и после... Можно сказать, Вам повезло :)

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


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

Не считайте упрямством, хочу разобраться. Постинкремент переменной работает после того, как ее использовали. Следовательно, после того, как будет записано вычисленное выражение. Логично?

После того как была выполнена конкретная операция, а не всё выражение. Постинкремент же относится к операции, а не ко всему выражению. Логично? :biggrin:

 

Компилятор использовал следующую команду для записи вычисленного выражения

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

STR r0,[r4],#4

Постинкремент

И что? какая разница какой командой он записал?

Он Вам написал что Ваше выражение можно понимать как:

pSigRe[0] = log2f(pSigRe[0]) * 15.0515;

pSigRe++;

так и:

pSigRe[0] = log2f(pSigRe[1]) * 15.0515;

pSigRe++;

И в результат компиляции выдал первый вариант. Хотя вполне справедливо мог и второй - это как ему удобнее.

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


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

Мог бы... Но не сделал. А сделал так, как мне и было нужно. Это я констатирую факт.

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

Вопрос, почему CppCheck ругается, а Keil молча делает, как было задумано. Кто из них тупит?

 

А окружение этой команды можно привести? До и после... Можно сказать, Вам повезло :)

Покажу оба варианта, ближе к обеду. :santa2: И оптимизацию разную проверю.

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


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

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

Как радиоинженер и непрофессиональный программист, я тоже предпочитаю не вспоминать приоритеты и не жалеть скобок.

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


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

Вопрос, почему CppCheck ругается, а Keil молча делает, как было задумано. Кто из них тупит?

Не знаю что за CppCheck, но он тут молодец, что предупредил. А Keil не молодец. Хотя может и молодец, что схавал, полагаясь на компетентность программиста (а иногда так и хочется наорать на компилятор "я знаю что я делаю, тварь!" :biggrin: ). Хотя и не молодец, хотя бы warning бы кинул...

 

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

Как радиоинженер и непрофессиональный программист, я тоже предпочитаю не вспоминать приоритеты и не жалеть скобок.

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

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

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


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

А еще правильнее написать авторам cppcheck и задать вопрос напрямую.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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