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

 
 
5 страниц V  < 1 2 3 4 5 >  
Reply to this topicStart new topic
x893
сообщение Feb 6 2018, 16:47
Сообщение #31


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



А если вдруг запустит на двух- и более процессорном кристалле ?
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Feb 6 2018, 17:00
Сообщение #32


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(Den64 @ Feb 6 2018, 20:41) *
Должно выполняться по порядку:
1. (*pSigRe)
2. log2f()
3. pSigRe++
4. *pSigRe
5. умножение
6. присвоение.
ИМХО так делать можно, компилятор не должен ругаться.

Компилятор может и не будет ругаться (а зря), однако так делать нельзя. Причины озвучены выше.
Go to the top of the page
 
+Quote Post
DASM
сообщение Feb 6 2018, 17:23
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Хорошо вас тут читать.. но.. мое мнение если можно "«Бывает ли у вас такие ситуации, когда слово, идиома или грамматическая конструкция иностранного языка никак не могут удержаться в голове, несмотря на то, что вы встречали её уже много раз и даже специально учили? А сколько процентов иностранных слов вы помните спустя месяц после их изучения? А спустя полгода? Сложно ли вам мотивировать себя на занятия иностранным языком?»
У меня на эти вопросы возникает только другой вопрос: А так ли оно мне надо, если я пользуюсь этими словами раз в пол года? Я лично против забивания мозга тем, что мне не сильно то и нужно."
как-то так примерно. Давно перестал запоминать все эти правила и стараться " типа красиво, в одну строку все". Мой код стал похож на "новичка" - разделяю все на строки не длиннее 80 символов (исключение - список инициализации конструктора), ставлю скобки где и не нужны. Зато не надо вспоминать 14 приоритетов и думать о sequnce point. Ну кто как хочет, только потом обычно с кодом разбираться самому и придется, и материть тоже самого себя. С cppreferencr.com тоже могу "офигенно красиво" написать, только вот потом подзабывается все это. Ну ладно, сорри что встрял в ученую беседу
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 6 2018, 17:58
Сообщение #34


Гуру
******

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



Цитата(DASM @ Feb 6 2018, 19:23) *
Я лично против забивания мозга тем, что мне не сильно то и нужно."
как-то так примерно. Давно перестал запоминать все эти правила и стараться " типа красиво, в одну строку все".

Трудно Вам придётся когда надо будет поработать в команде с другими программёрами. ...у которых свои понятия.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Feb 6 2018, 17:58
Сообщение #35


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(DASM @ Feb 6 2018, 20:23) *
Хорошо вас тут читать.. но.. мое мнение если можно "«Бывает ли у вас такие ситуации, когда слово, идиома или грамматическая конструкция иностранного языка никак не могут удержаться в голове, несмотря на то, что вы встречали её уже много раз и даже специально учили? А сколько процентов иностранных слов вы помните спустя месяц после их изучения? А спустя полгода? Сложно ли вам мотивировать себя на занятия иностранным языком?»
У меня на эти вопросы возникает только другой вопрос: А так ли оно мне надо, если я пользуюсь этими словами раз в пол года? Я лично против забивания мозга тем, что мне не сильно то и нужно."
как-то так примерно. Давно перестал запоминать все эти правила и стараться " типа красиво, в одну строку все". Мой код стал похож на "новичка" - разделяю все на строки не длиннее 80 символов (исключение - список инициализации конструктора), ставлю скобки где и не нужны. Зато не надо вспоминать 14 приоритетов и думать о sequnce point. Ну кто как хочет, только потом обычно с кодом разбираться самому и придется, и материть тоже самого себя. С cppreferencr.com тоже могу "офигенно красиво" написать, только вот потом подзабывается все это. Ну ладно, сорри что встрял в ученую беседу

Я тоже пишу максимально просто и без лишней головной боли.
Просто понимаю, какие конструкции к чему могут привести с точки зрения стандарта языка. А чтобы это начать понимать, пришлось не одну ложку дегтя съесть в других проекта)))
Go to the top of the page
 
+Quote Post
AnatolyT
сообщение Feb 6 2018, 18:41
Сообщение #36


Частый гость
**

Группа: Участник
Сообщений: 176
Регистрация: 29-03-10
Пользователь №: 56 269



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

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++;
}

Стараюсь глубоко не разбираться в идиомах различных компиляторов.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 6 2018, 20:00
Сообщение #37


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

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



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

Цитата(AnatolyT @ Feb 6 2018, 21:41) *
Если SigRe это массив, может следует к нему обращаться как к массиву.

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

Цитата(jcxz @ Feb 6 2018, 19:33) *
Я думаю, что ViKo никогда ещё не включал оптимизацию. И не заглядывал при этом в асм biggrin.gif

Первое высказывание исключает второе. Если учесть, что оба неверные, следует, jcxz = трепач. biggrin.gif
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Feb 6 2018, 20:24
Сообщение #38


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(ViKo @ Feb 6 2018, 23:00) *
Не считайте упрямством, хочу разобраться. Постинкремент переменной работает после того, как ее использовали. Следовательно, после того, как будет записано вычисленное выражение. Логично?

Нет, не так.
Постинкремент переменной не определён внутри выражения.
Рассмотрим пример:
Код
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 - Feb 6 2018, 20:47
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 6 2018, 20:49
Сообщение #39


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

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



Компилятор использовал следующую команду для записи вычисленного выражения
*pSigRe++ = log2f(*pSigRe) * 15.0515;

STR r0,[r4],#4
Постинкремент
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Feb 6 2018, 21:01
Сообщение #40


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(ViKo @ Feb 6 2018, 23:49) *
Компилятор использовал следующую команду для записи вычисленного выражения
*pSigRe++ = log2f(*pSigRe) * 15.0515;

STR r0,[r4],#4
Постинкремент

А окружение этой команды можно привести? До и после... Можно сказать, Вам повезло sm.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 6 2018, 21:37
Сообщение #41


Гуру
******

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



Цитата(ViKo @ Feb 6 2018, 22:00) *
Не считайте упрямством, хочу разобраться. Постинкремент переменной работает после того, как ее использовали. Следовательно, после того, как будет записано вычисленное выражение. Логично?

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

Цитата(ViKo @ Feb 6 2018, 22:49) *
Компилятор использовал следующую команду для записи вычисленного выражения
*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++;

И в результат компиляции выдал первый вариант. Хотя вполне справедливо мог и второй - это как ему удобнее.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 7 2018, 05:10
Сообщение #42


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

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



Мог бы... Но не сделал. А сделал так, как мне и было нужно. Это я констатирую факт.
Переписать, чтобы инкрементировался указатель отдельным выражением, легко. Выше уже давно сделал.
Вопрос, почему CppCheck ругается, а Keil молча делает, как было задумано. Кто из них тупит?

Цитата(Arlleex @ Feb 7 2018, 00:01) *
А окружение этой команды можно привести? До и после... Можно сказать, Вам повезло sm.gif

Покажу оба варианта, ближе к обеду. santa2.gif И оптимизацию разную проверю.
Go to the top of the page
 
+Quote Post
V_G
сообщение Feb 7 2018, 05:22
Сообщение #43


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

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



Я думаю, если ассемблер данного конкретного контроллера поддерживает постинкремент указателей, и компилятор использует это свойство, то результат будет всегда один. Если же перейти на проц, где нет этой фичи (или уже не хватает регистров для указателей), результаты компиляции могут быть неоднозначными.
Как радиоинженер и непрофессиональный программист, я тоже предпочитаю не вспоминать приоритеты и не жалеть скобок.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Feb 7 2018, 05:41
Сообщение #44


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(ViKo @ Feb 7 2018, 08:10) *
Вопрос, почему CppCheck ругается, а Keil молча делает, как было задумано. Кто из них тупит?

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

Цитата(V_G @ Feb 7 2018, 08:22) *
Я думаю, если ассемблер данного конкретного контроллера поддерживает постинкремент указателей, и компилятор использует это свойство, то результат будет всегда один. Если же перейти на проц, где нет этой фичи (или уже не хватает регистров для указателей), результаты компиляции могут быть неоднозначными.
Как радиоинженер и непрофессиональный программист, я тоже предпочитаю не вспоминать приоритеты и не жалеть скобок.

Ассемблер тут совершенно ни при чем. Это полностью зависит от компилятора. Реализовано ли в системе команд постинкремент или нет, совершенно не важно, компилятор может спокойно разбить постинкремент на несколько инструкций.
Я не понимаю одного - если в стандарте четко написано о таких вещах, зачем намеренно создавать себе проблему "кодированием через пробы и ошибки"? Ведь даже элементарное включение оптимизации может привести совершенно к другому порядку инструкций, и гарантировать равнозначное поведение в данном случае невозможно.
Go to the top of the page
 
+Quote Post
x893
сообщение Feb 7 2018, 06:03
Сообщение #45


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



А еще правильнее написать авторам cppcheck и задать вопрос напрямую.
Go to the top of the page
 
+Quote Post

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

 


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


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