Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: С/С++
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Программирование
Страницы: 1, 2, 3
dxp
QUOTE (Kopa @ Sep 1 2014, 21:08) *
Всё программирование в конечном счёте сводится к пересылкам одних ячеек памяти в другие (или одного потока данных процедуры к другой процедуре) с какими то преобразованиями при этом.

"Цель работы программиста - намагнитить быстро вращающиеся диски в нужных местах" (с).
Major
Если кейл сделает полноценную поддержку C++11/14 будет прорыв. Писать код на старом стандарте уже нет возможности.
GCC хорош, но не самый айс. Clang (llvm) все руки не доходят посмотреть.
Однозначно выбирать C++ или другие языки. Язык C - это прошлое (хотя и не плохое прошлое).

Хотя и в C++ есть раздражители. После питона ставить фигурные скобочки утомляет, нет контрактов, по исключению нельзя размотать стек как в яве или питоне, лишняя многословность в шаблонах (плюс еще по мелочам). Если "корпорации" подхватят D, то будет неплохо лет через 5-10.

Я писал на яве для восьми битного Dallas еще 10 лет назад (если кто помнит были tini). После это поверил в яву. Отклик был приемлемый, работа с сетью на полной нагрузке (10мбит вроде).

thermit
wacko.gif
kolobok0
Цитата(dxp @ Sep 2 2014, 08:42) *
"Цель работы программиста - намагнитить быстро вращающиеся диски в нужных местах" (с).


sm.gif)) в точку. правда больше для эпохи DOS.
AlexandrY
Цитата(Major @ Sep 2 2014, 08:18) *
Однозначно выбирать C++ или другие языки. Язык C - это прошлое (хотя и не плохое прошлое).


Пока линукс не перепишут на C++, этот C++ отстанется только приставкой к C-и для тех кто изнывает от скуки на работе.
И потом о нем будут вспоминать как о неком таком корявом расширении C-и появившемся в конце эпохи однопоточных языков. biggrin.gif
Major
А как связаны линукс и С++?
Про скуку просто смешно. Если Вы не используете:
1 автоматический вывод типов
2 static_assert
3 шаблоны (копипастите по случаю и без)
4 семантически безопасные контракты-классы (передаете указатели на структуры в функции)
5 про STL уже и так понятно, можно еще сказать про лямбды и семантику пеермещения
то Вы зря тратите время.
Прочитайте новый стандарт, или введение в него. Язык это не буковки и ключевые слова. Язык это фразы и ++ гораздо богаче С.
C++ тоже не идеал, но держаться за С (даже если это С99) сомнительная затея.

AlexandrY
Цитата(Major @ Sep 3 2014, 11:07) *
А как связаны линукс и С++?
Про скуку просто смешно. Если Вы не используете:
1 автоматический вывод типов
2 static_assert
3 шаблоны (копипастите по случаю и без)
4 семантически безопасные контракты-классы (передаете указатели на структуры в функции)
5 про STL уже и так понятно, можно еще сказать про лямбды и семантику пеермещения
то Вы зря тратите время.
Прочитайте новый стандарт, или введение в него. Язык это не буковки и ключевые слова. Язык это фразы и ++ гораздо богаче С.
C++ тоже не идеал, но держаться за С (даже если это С99) сомнительная затея.


Я ща википедию открою и еще больше лабуды из C++ перечислю. wink.gif
А что нибудь нам реально показать из своей нетленки на C++ (для микроконтроллеров, разумеется) ?

А то с STL мы тут уже разобрались - http://electronix.ru/forum/index.php?showt...6&hl=median
Ничего впечатляющего. Слезы.
В IAR вообще катастрофа.
-fender-
может не по теме, но навеяно хабром
выстрелить себе в ногу
Xenia
Русский язык еще древнее, чем C/C++. Почему, тем не менее, на нем продолжают говорить, а не переходят на более современные языки? sm.gif
Major
По медиане - написано просто страшно, так делать нельзя. Это говнокод (и это не оскорбление).
По коду, в конце недели (суббота) могу выложить, если есть практический интерес.
Могу переписать медиану, так чтобы был использован std::nth_element. Сравним.


AlexandrY
Цитата(Major @ Sep 3 2014, 12:59) *
..Это говнокод (и это не оскорбление)...


Новая этика? wacko.gif

Цитата(Major @ Sep 3 2014, 12:59) *
Могу переписать медиану, так чтобы был использован std::nth_element. Сравним.


Конечно, ждем.
Lagman
Цитата(Xenia @ Sep 3 2014, 13:42) *
Русский язык еще древнее, чем C/C++. Почему, тем не менее, на нем продолжают говорить, а не переходят на более современные языки? sm.gif

Почему не переходят, еще как, или Вы понимаете церковнославянский язык?
Major
Написал набросок, без строгих требований к интерфейсу. Проверил на ПК (release).
Выравнивание на кэш сделал, гонку кэша запретил.
10000000 случайных значений на окне 32.
Мой код 2,7 сек.
Стартовый код из темы про медиану 11 сек.
Генератор чисел: 250 мс.
В субботу скомпилирую для keila. В симуляторе проверить будет достаточно (такты процессора)?
Код и результат симуляции выложу.
A. Fig Lee
Цитата(Major @ Sep 3 2014, 05:59) *
По медиане - написано просто страшно, так делать нельзя. Это говнокод (и это не оскорбление).

Нормальный код. Код как код.

Цитата(Major @ Sep 3 2014, 05:59) *
По коду, в конце недели (суббота) могу выложить, если есть практический интерес.
Могу переписать медиану, так чтобы был использован std::nth_element. Сравним.

А зачем? Зачем использовать 64 битный суперкомп где справится 8битник?
Человек живет не для того, чтобы есть, а ест для того чтобы жить.

А то как в анекдоте: купил автомобиль и сколько всего успел:
и колеса переобуть и масло сменить и на автобазар слетать за свечами..

Суета это.
juvf
Цитата(AlexandrY @ Sep 3 2014, 14:26) *
Я ща википедию открою и еще больше лабуды из C++ перечислю. wink.gif

какой лабуды? У с++ спектор шире си. На нём можно и для 8-битного процесора написать код не хуже чем на си, и для всяких монстров под управением Linux, Windows. На си конечно тоже можно для монстров писать, но для монстров и на асме можно слобать код. В таком же ключе можно поспорить си vs асм, что асм - это единственный нормальный язык, а СИ - это корявость, и что выстрелить в ногу в си, и приплесть сюда что русский древний, поэтому на асме нужно остаться, бла бла бла.
adnega
Мне кажется, что С++ тесно связан с такими понятиями как "архитектура приложения", "шаблоны проектирования" и "командная разработка", и существенно отличается от С в качестве инструмента для реализации этих подходов.
Xenia
Начинающие в программировании зачастую проявляют непонимание, для чего в программе нужны for-циклы, удивляясь необходимости повторять "оно и тоже" по многу раз. Мол, зачем вычислять по второму разу, если в первый раз это уже вычислили? sm.gif Затем приходит понимание того, что в цикле "одно и тоже" делается над разными данными, обычно хранящимися в массивах, чтобы в цикле было удобно их вызывать по порядковому номеру.

Однако этот механизм вынуждает работать с однородными данными, которые, будучи положенными на ленту конвейера, в дальнейшим подвергались бы одной и той же процедуре обработки. Однако в реальных задачах, как и в жизни, не всегда так бывает. Скажем, конвейер идеально подходит, чтобы затыкать пивные бутылки пробками sm.gif, но не вполне подходит, когда пациенты выстроили в очередь на прием к врачу. Понятно, что врач в данной ситуации не может работать, как цикл for, назначая всем пациентам одно и то же лечение.

Разбираться внутри цикла с тем, кому какое лечение требуется, в случае врача можно, но в программировании этому мешает как раз та самая однородность данных, которые хранятся в массивах. Т.е. в последнем случае элемент данных не проявляет достаточной индивидуальности, чтобы по ней выбрать специфику его обработки. Коротко говоря, специфика и однородность являются в данном случае противоположностями.

Конечно, и на обычном C можно попытаться решать подобные задачи. Например, работая не с массивом чисел, а с массивом структур, в которых, помимо числа, содержится некий признак того, как это число надо обрабатывать. Именно отсюда и вырос язык C++, взявшись снять требование однородности данных внутри цикла. И пусть достичь этой цели в полной мере ему не удалось (т.к. сама эта цель едва ли достижима), но сделано в этом направлении очень многое. По меньшей мере, пришло понимание того, что предмет обработки это не просто число, а целый объект, с вытекающими отсюда последствиями. А к тому времени, когда объекты, более крупные, чем число, расплодились в таком множестве, когда их прямое перечисление (без цикла) стало затруднительным, вот тут-то C++ и получил свою популярность. По праву.
ViKo
Вообще-то, в названии темы говорится не о том, почему C++ лучше C, а что C# лучше убогого C++.
dxp
QUOTE (Xenia @ Sep 4 2014, 17:45) *
Именно отсюда и вырос язык C++<...>

Позволю себе не согласиться. С++ вырос совсем не отсюда, а от скрещевания низкоуровневого языка С и концепции классов языка Simula (см "Дизайн и эволюция С++" Б.Страуструпа), что позволило иметь возможность писать быстрый, эффективный код (это и сейчас во многих случаях актуально, а тогда было жизненно необходимо) и при этом оперировать программными объектами, отмапливая их на объекты реального мира, т.е. сделать процесс разработки ПО более тесно и нативно связанным с целевой областью.

А отсюда если что и выросло, так это контейнеры, итераторы, алгоритмы, в общем, STL.
AlexandrY
Цитата(juvf @ Sep 4 2014, 04:22) *
какой лабуды? У с++ спектор шире си. На нём можно и для 8-битного процесора написать код не хуже чем на си, и для всяких монстров под управением Linux, Windows. На си конечно тоже можно для монстров писать, но для монстров и на асме можно слобать код. В таком же ключе можно поспорить си vs асм, что асм - это единственный нормальный язык, а СИ - это корявость, и что выстрелить в ногу в си, и приплесть сюда что русский древний, поэтому на асме нужно остаться, бла бла бла.


Некорректные аналогии.
С-и сократил писанину в несколько раз по сравнению с asm и был прорывом.
А С++ ее не сократил, а даже снова раздул. Это уже деградация, декаданс.

И это понятно, цикл старого всегда кончается деградацией.
dxp
QUOTE (AlexandrY @ Sep 4 2014, 19:14) *
Некорректные аналогии.
С-и сократил писанину в несколько раз по сравнению с asm и был прорывом.
А С++ ее не сократил, а даже снова раздул. Это уже деградация, декаданс.

Да, раздул. Например, эти пресловутые виртуальные функции. Ведь же целое слово ключевое придумали - virtual! И теперь такое объявление функции записывается длиннее, чем простое в С. Ну, правда, на С придётся для реализации того же функционала написать тучу кода с таблицами указателей на функции, проинициализровать их (а ещё объявления прототипов функций там надо вначале написать), и всё руками, и всё аккуратно - недайбох ошибиться, оченно подлые косяки получаются при некорректной работе с указателями и массивами, а особенно массивами указателей... Ну, да это фигня, настоящему С-кодеру это семечки, зато не придётся развозить эту писанину с virtual... Ну, а про STL вообще чего говорить - сплошная лишняя писанина, на голом С это делается в три строчки само собой и без ошибок. biggrin.gif
Xenia
Цитата(dxp @ Sep 4 2014, 17:32) *
Да, раздул. Например, эти пресловутые виртуальные функции. Ведь же целое слово ключевое придумали - virtual! И теперь такое объявление функции записывается длиннее, чем Ну, правда, на С придётся для реализации того же функционала написать тучу кода с таблицами указателей на функции, проинициализровать их (а ещё объявления прототипов функций там надо вначале написать), и всё руками, и всё аккуратно - недайбох ошибиться, оченно подлые косяки получаются при некорректной работе с указателями и массивами, а особенно массивами указателей... Ну, да это фигня, настоящему С-кодеру это семечки, ...


Интересный (для меня) вопрос вы затронули. Хочу спросить, известно ли вам, как на простом C это может быть реализовано? Сама хотела бы вставить функции во внутрь структуры, то C этого не ест. Можно, конечно, как вы сказали, вместо функций указатели туда прописать, но тогда им инициализация нужна, и вызовы таких функций будут "косвенными", путем разыменовывания указателей на функцию.

Но если поглядеть на то, как родной C++ компилирует, то там вызовы функций-членов класса прямые (конечно, если перед этим они не были объявлены виртуальными). Как такое удается сделать, если С++ считать "надстройкой" над C, которая может быть транслирована на C препроцессором? В ведь именно так оно и было, по крайней мере, раньше.

P.S. Сама я C++ обожаю, но при программировании МК стараюсь его избегать - отпугивает излишний "динамизм", когда многое неявным образом заводится в куче. А я привыкла к спартанским ресурсам, когда под кучу памяти жалко, и хотелось бы всё по максимуму держать в статике.
dxp
QUOTE (Xenia @ Sep 5 2014, 00:08) *
Интересный (для меня) вопрос вы затронули. Хочу спросить, известно ли вам, как на простом C это может быть реализовано? Сама хотела бы вставить функции во внутрь структуры, то C этого не ест. Можно, конечно, как вы сказали, вместо функций указатели туда прописать, но тогда им инициализация нужна, и вызовы таких функций будут "косвенными", путем разыменовывания указателей на функцию.

Реализовать можно по той же схеме, которую использует компилятор С++. Только толку от этого будет мало - всё - определение таблиц указателей на функции, указатели на эти таблицы, инициализацию таблиц и указателя, объявление прототипов и т.д. - придётся делать руками. А профиту ноль. Ведь рулез от виртуальных функций (методов) именно в том, что программисту не нужно заморачиваться на контроле соответствия объектов и их функций - всё работает само. В С уже тот факт, что нельзя отнаследовать одну структуру от другой, сводит почти все плюсы технологии к нулю. Но руками всё это можно делать, это будет своего рода паттерн проектирования. В плюсах это реализовывается так.

В каждом классе, где объявлена хотя бы одна виртуальная функция (метод), создаётся служебный указатель vtbl - это указатель на таблицу указателей на виртуальные функции объектов этого класса. Эта таблица создаётся отдельно и инициализирутся адресами виртуальных фукнций класса. При виртуальном вызове происходит не прямой вызов функции, а (vtbl->vtable[<offset>])(), т.е. по указателю vtbl производится обращение к таблице указателей, берётся адрес требуемой функции (по смещению <offset>) и уже по этому адресу производится вызов функции. В реальности, например, на MSP430 виртуальный вызов выливается в дополнительные две регистровые однотактовые команды.

Описанный подход гарантирует, что на рантайме будет вызван метод класса, к объекту которого применяется вызов функции. Ну, собсно, это основа динамического полиморфизма, позволяет строить иерархии классов, у каждого из которых свои методы. Следует отметить, что при всей мощи, красоте и эффективности подхода не надо его применять везде. У него своя "ниша". Например, он отлично ложится на реализацию GUI или его удобно использовать в парсерах коммуникационных протоколов и их стеках. Это просто средство. Которое рулит там, где оно эффективно. Очень часто начинающие по неопытности пытаются всё делать на методах, в результате получают сложные перекрёстные зависимости, оверхед и прочие проблемы.


QUOTE (Xenia @ Sep 5 2014, 00:08) *
Но если поглядеть на то, как родной C++ компилирует, то там вызовы функций-членов класса прямые (конечно, если перед этим они не были объявлены виртуальными). Как такое удается сделать, если С++ считать "надстройкой" над C, которая может быть транслирована на C препроцессором? В ведь именно так оно и было, по крайней мере, раньше.

То, что С++ является надстройкой над С - глубокое заблуждение. С++ является надмножеством С, но это совершенно самостоятельный язык и его конструкции не могут быть "странслированы на С препроцессором". И компилятор С++ - совершенно отдельная программа, работающая по своим правилам. Из С++ на С странслировать код технически несложно, но это ни разу не препроцессор. И просто такая задача давно уже никому не нужна. Такой компилятор в истории был, он был написан самим Б.Страуструпом на начальном этапе разработке С++ и назывался "С с классами". Страуструпу было удобно использовать уже имеющиеся С компиляторы - это избавляло его от написания back-end и позволяло сосредоточиться на отработке правил нового языка.

QUOTE (Xenia @ Sep 5 2014, 00:08) *
P.S. Сама я C++ обожаю, но при программировании МК стараюсь его избегать - отпугивает излишний "динамизм", когда многое неявным образом заводится в куче. А я привыкла к спартанским ресурсам, когда под кучу памяти жалко, и хотелось бы всё по максимуму держать в статике.

Напрасно опасаетесь. С++ - язык со строгой статической типизацией, ориентированный на разработку критичного к быстродействию и потреблению ресурсов кода. Он не заставляет программиста использовать механизмы, которые не подходят к задаче или с которыми программист недостаточно хорошо знаком. "Динамизм" в вашей программе на С++ может появится только по вашей воле.

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

При некотором опыте вы сможете начинать разработку программы с рисования структурной схемы, где прямоугольники будут обозначать объекты, а стрелки связи между ними - открытые функции-члены (т.е. интерфейс классов). Это позволит сразу исключить некоторые логические ошибки и заложить правильную архитектуру программы - "скелет". Потом останется только разработать представление классов (закрытую часть). На деле, конечно, это всё не так просто, нужен опыт, но при желании он приходит очень быстро. После этого возвращаться к одному только процедурному программированию уже не захочется. К слову, процедурного программирования в С++ остаётся вдоволь - практически вся реализация функций - это оно и есть, т.ч. любителям С скучать не придётся. sm.gif
AlexandrY
Цитата(dxp @ Sep 5 2014, 07:56) *
У него своя "ниша". Например, он отлично ложится на реализацию GUI или его удобно использовать в парсерах коммуникационных протоколов и их стеках.


Но пока мы даже скриншоты вашего эпического GUI не видели. biggrin.gif
Если C++ такой мощный, то и GUI видать должно превосходить по изобразительным возможностям какую-нибудь uC/GUI многократно?


Цитата(Xenia @ Sep 4 2014, 20:08) *
P.S. Сама я C++ обожаю, но при программировании МК стараюсь его избегать - отпугивает излишний "динамизм", когда многое неявным образом заводится в куче. А я привыкла к спартанским ресурсам, когда под кучу памяти жалко, и хотелось бы всё по максимуму держать в статике.


Вот он! Голос народа!

"обожаю, но" .. "стараюсь его избегать" - лучше не скажешь.
Предположу что это интуиция наработанная годами.

Я бы сказал C++ отторгается всей embedded экосистемой.

ViKo
Проникся, вдохновлен и нацелен на использование C++ в микроконтроллерах, спасибо dxp!
Только не соображу, как на объекты программу делить? Обычно, где-то передается, где-то принимается. Куда задвигать функцию пересылки (приема)?
dxp
QUOTE (AlexandrY @ Sep 5 2014, 13:23) *
Но пока мы даже скриншоты вашего эпического GUI не видели. biggrin.gif
Если C++ такой мощный, то и GUI видать должно превосходить по изобразительным возможностям какую-нибудь uC/GUI многократно?

Похоже, что GUI для вас - это набор картинок. Поздравляю.

QUOTE (AlexandrY @ Sep 5 2014, 13:23) *
Вот он! Голос народа!

"обожаю, но" .. "стараюсь его избегать" - лучше не скажешь.
Предположу что это интуиция наработанная годами.

Интуиция нужна там, где не хватает информации. Что касается С++, то информации по нему море, нужно только пойти и взять. Сколько уже ломали копий на тему плюсов, ни разу никто из оппонентов не показал проигрыш С++ по сравнению с С. Только общие заклинания и слоганы, не подтверждаемые практикой. Как с вашим предыдущим постом о якобы увеличении писанины.

У меня давно уже есть наблюдение, что активно ругают С++ люди, которые его не знают как следует даже на начальном уровне. Извините, но при всём уважении к вам, как квалифицированному специалисту во многих технических областях, вас я отношу именно в эту категорию. Пока что ваши посты на тему С++ доказывают это, а не обратное. Мне, собственно, без разницы, как вы там видите С++ в своей профессиональной деятельности, но ваши публичные замечания на эту тему, давя авторитетом, формируют неверное представление о предмете у тех, кто пока только приступает к изучению темы, что не в последнюю очередь создаёт "интуицию, наработанную годами".

QUOTE (AlexandrY @ Sep 5 2014, 13:23) *
Я бы сказал C++ отторгается всей embedded экосистемой.

Ага, ага, особенно на этом поприще стараются производители компиляторов, которые уже давно сплошь реализовали плюсовые версии буквально подо всё, на что хоть как-то ложится C/C++. Они ж дурные, эти производители, денек не считают, впаливают средства почём зря.

QUOTE (ViKo @ Sep 5 2014, 13:42) *
Проникся, вдохновлен и нацелен на использование C++ в микроконтроллерах, спасибо dxp!
Только не соображу, как на объекты программу делить? Обычно, где-то передается, где-то принимается. Куда задвигать функцию пересылки (приема)?

Совет тот же, что и для Ксении: для начала просто попробуйте заменить какую-нибудь структуру и ассоциированные с ней фукнции (если таковые есть) классом. Попробуйте изолировать данные структуры от внешнего мира, организовав работу только через функции. При этом вы столкнётесь с тем, что нужно продумать, какие функции будут нужны, т.е. интерфейс класса. При удачном варианте у вас будет законченный объект со скрытым представлением и явным интерфейсом, через который оный объект будет взаимодействовать с внешним миром.

А программу на объекты делить достаточно просто (уже говорилось в предыдущем посте): нужно классам программы сопоставить объекты реального мира. Не нужно выдумывать искусственных сущностей, нужно брать то, что уже есть. Сразу будет получаться не очень, как и любое новое дело, но этот опыт приходит очень быстро.
AlexandrY
Цитата(ViKo @ Sep 5 2014, 09:42) *
Проникся, вдохновлен и нацелен на использование C++ в микроконтроллерах, спасибо dxp!
Только не соображу, как на объекты программу делить? Обычно, где-то передается, где-то принимается. Куда задвигать функцию пересылки (приема)?


Браво!
Все расплакались от умиления. crying.gif

Так мнимое превосходство "знающих" C++ как раз в этой магии "как на объекты программу делить". Еще есть такая магия - "паттерны"

Но ответ будет всегда один - вы просто "неопытный" (читай - лох ), несмотря на ваш огромный опыт в embedded.
В крайнем случае не можете общее отделить от специфичного. Или вообще не знаете мир в его связях и смыслах.
Valentine Loginov
А ведь можно писать под МК на плюсах и в процедурном стиле ;-) Объектный подход не всегда нужен, хотя я вот без него уже не могу sad.gif
Удивляют люди, который говорят про "жалко место под кучу", как будто плюсы обязывают пользоваться кучей, а не стеком.
Плюсы дают возможность писать код куда удобней и понятней, жаль не все это понимают. Но и не все знают Си на хорошем уровне, ведь многие - электронщики, программисты по-совместительству, которым само программирование не так и интересно sm.gif
ООП можно использовать и в Си, например книга Object-Oriented Programming With ANSI-C. Конечно, когда есть компиляторы плюсов для МК, лучше пользоваться ими, но понять как оно реализовано в С++ (то, что спрятано), эта книга очень поможет.
Да и спор-то бессмысленный. Куда лучше смотреть на грамотный, оптимизированный код на любом из языков, чем на говнокод sm.gif Архитектура программного обеспечения > язык программирования.
juvf
Цитата(AlexandrY @ Sep 4 2014, 18:14) *
А С++ ее не сократил, а даже снова раздул. Это уже деградация, декаданс.

пруф или трепло?

Цитата
Сколько уже ломали копий на тему плюсов, ни разу никто из оппонентов не показал проигрыш С++ по сравнению с С. Только общие заклинания и слоганы, не подтверждаемые практикой.
+1.

Цитата
Сама я C++ обожаю, но при программировании МК стараюсь его избегать - отпугивает излишний "динамизм", когда многое неявным образом заводится в куче. А я привыкла к спартанским ресурсам, когда под кучу памяти жалко, и хотелось бы всё по максимуму держать в статике.
И зря. Боишся динамики может и не зря, но ++ это не динамика. В компиляторе с++ для авр нету new/delete. Тем не менее на с++ даже без динамики удобней писать. Пиши по спартански, но на с++.

Цитата
Я бы сказал C++ отторгается всей embedded экосистемой.
гггг вбросте это говно в вентелятор на ветке форума scmRTOS, и ждите пулю в лоб lol.gif
Major
Кому интересно (стр. 4).
Цитата
А то с STL мы тут уже разобрались - http://electronix.ru/forum/index.php?showt...6&hl=median
Ничего впечатляющего. Слезы.


Вот ссылка на мой код: https://bitbucket.org/Glavny/medest/src
В Keil MDK-Lite 5.11 он работает в два раза быстрее чем код klen (в репозитории его нет. но если надо, могу выложить здесь).
В MSVC на окне 64 в 5 раз быстрее.
Если компилировать для контейнера container_std_array_t, то даже std::vector не зацепится.

kolobok0
Цитата(ViKo @ Sep 5 2014, 10:42) *
...как на объекты программу делить? ..где-то передается, где-то принимается. ..функцию пересылки (приема)?


Открою большой секрет:
многие программисты, с большой распальцовкой, пишущие на си плас плас думают что это относится к ОО на автомате.
Более того - практически нет контор которые грамотно делают эти шаги: OOA, OOD, OOP.
Более того, для снижения порога вхождения в тему, и в угоду лени шагнули от ОО и явили на свет патерны (бизнес задач не бывает
двух одинаковых в природе вообще. посему попытка натянуть жизнь на узкий шаблон - не есть ОО подход и побольшому счёту сие ЗЛО).

как делить на объекты. Это вопрос вопросов на самом деле. Лучше конечно же обратиться к истокам - одному из прародителей ОО
Гради Бучу. В своей книге он попытался разжевать этот момент. Многие за маленькими квантиками инфы не увидели ребёнка и...
и продолжают писать на азме используя си плас плас... увы во многих конторах программирования это так...

Одна из мыслей от старика Буча, которая тут уже прозвучала - идти от бизнес сущностей. Т.е. это то, что будет статично на ВСЁМ ПРОТЯЖЕНИИ
ЖИЗНИ ПРОЕКТА!!! Это и понятно - если бизнес по торговле шинами, то выращивать пшеницу явно не будут - либо это уже другой бизнес и
соответственно другие задачи, в том числе и программерские. Это один из больших плюсов данного подхода в решении задач.

Почему не всё так гладко на этом поприще. Потому, как инструментов много. Достаточно мощные они. Один из инструментов - наша голова.
В мыслях мы зачастую убегаем далеко вперёд, пытаясь воплощать в код очевидные и понятные для нас вещи (тут вот и появляется одна
из засад - мы то не идеальны. и то что предпологаем - это не всегда истина). И отходим(искушение ох как велико) от основных принципов ОО.
Тут и приходит большой, толстый и пушистый зверёк... Второй, по частоте встречаемых проблем - это коллектив. Когда одна голова = OOA,OOD
пролетает в миг (в зависимости от опыта), когда два и больше человека = то тут уже нужно общение. Причём вектора опыта в решении
подобных задач должны складываться и дополнять друг друга а не вычитаться. За частую процесс обсуждения и поиска сводят на нет. Либо
это выполняет человек, который вмиг поумнел и стал делать всё правильно в момент его назначения на эту работу. Либо спускают сей процес
на стадию OOP уничтожая её и контролируя только резульат на предмет явных ошибок, кодинг рулеса и прочей вторичной ботвы. (По секрету скажу:
чтоб коллектив единомышленников начал друг друга только СЛЫШАТЬ - проходит около ДВУХ МЕСЯЦЕВ общения, по часу в день где то как минимум... это
о порядках и величинах...)

Для первых шагов - рекомендую почитать Буча. Как вариант спросить про декомпозицию конкретной Вашей задачи на форуме.
Путь не быстрый и сварливый, но мысли даст для размышлений - что не мало и важно sm.gif
dxp
QUOTE (Major @ Sep 6 2014, 02:57) *
Вот ссылка на мой код: https://bitbucket.org/Glavny/medest/src

Очень красивый код. Чувствуется опыт и зрелость, в общем, уровень! Я до такого (надеюсь пока sm.gif ) не дорос.

P.S. Готов биться об заклад, оппонент не оценит: и не сможет, и не захочет.

QUOTE (kolobok0 @ Sep 6 2014, 07:37) *
Для первых шагов - рекомендую почитать Буча.

За Г.Буча +1.
Xenia
Цитата(dxp @ Sep 6 2014, 11:17) *
Очень красивый код. Чувствуется опыт и зрелость, в общем, уровень! Я до такого (надеюсь пока sm.gif ) не дорос.

P.S. Готов биться об заклад, оппонент не оценит: и не сможет, и не захочет.


Этот код красив только тем, что хорошо раскрашен в разные цвета sm.gif, но любителей простого C (а тем паче ассеблера!) такие конструкции приведут в ужас. Чего стоит хотя бы это:

Код
template<typename tobj_t>
auto test_2(tobj_t& tobj, size_t tn) -> decltype(tobj(0))
{
    auto result = tobj(0);
    decltype(result) input[] = { 8, 9, 10, 8, 10, 11, 0, 1, 2 };

    for (auto& v : input){
        result = tobj(v);
        v = result; // write-back
    }
    return result;
}


Пример среди этого кода специально выбрала такой, чтобы делало что-нибудь предельно простенькое, но выглядело зловеще. sm.gif
halfdoom
Сугубо практический взгляд со стороны. Этим летом мы сдавали с подрядчиком контроллер техпроцесса (все x86+Linux, порядка 10 отдельных контроллеров). Наши ребята писали все на чистом C++ с Qt (лицензия на последний принадлежит заказчику) - это 7 контроллеров. Подрядчик писал на Java (остальные контроллеры). До выезда на объект было написано множество тестэ-кейсов, вопросы взаимодействия были более или менее отлажены.

Запуск линии прошел на ура, а проблемы начались на 3й день работы. После разбора полета выяснилось, что контроллеры на Java не успевали отрабатывать все события, причем простой перезапуск системы полностью восстанавливал работоспособность. Их ребята выяснили, что 2ГБ на процесс им мало. Причем ничего навороченного там нет, математика на уровне 3го курса. Одноплатные компьютеры у заказчика специфические, поэтому нарастить память возможности нет. В итоге, что-то они там крутили в параметрах Java-машины и все пришло в норму. Это стоило нам лишней недели командировки, но теперь мы единственный исполнитель на следующую линию, что можно отнести к несомненным плюсам Java технологий.

С другой стороны, у меня есть возможность оценивать работу программистов пишущих на C++/Qt и FreePascal/Lazarus. UI последние однозначно пишут быстрее, но кривость LCL периодически вылазит на кросс-платформенных приложениях. Так-же, подключение сторонних C/C++ библиотек на Паскале не так прозрачно как на C++. Совершенно отвратительно выглядят интерфейсы к C++ библиотекам, а некоторые части сильно завязанные на шаблоны вообще невозможно использовать. И о шаблонах - сам я в них не большой специалист, и иногда вообще не могу понять код изобилующий ключевым словом template... Но это уже моя проблема, т.к. все компилируется и работает sm.gif.

Думаю, что C++ рано списывать со счетов, а скорость разработки и качество кода однозначно зависит от программистов и их непосредственного руководителя (который у нас тоже программист).
Xenia
Цитата(halfdoom @ Sep 6 2014, 14:12) *
Сугубо практический взгляд со стороны. Этим летом мы сдавали с подрядчиком контроллер техпроцесса (все x86+Linux, порядка 10 отдельных контроллеров). Наши ребята писали все на чистом C++ с Qt (лицензия на последний принадлежит заказчику) - это 7 контроллеров. Подрядчик писал на Java (остальные контроллеры). До выезда на объект было написано множество тестэ-кейсов, вопросы взаимодействия были более или менее отлажены.


В тех случаях, когда на контроллере операционка стоит, то это уже "взрослый" контроллер, которому C++ не будет в тягость. А уж про Qt и вопрос не стоит - без C++ там никак нельзя. Да и вообще, если есть 1 МБ памяти, то отказываться от C++ просто глупо.

Я же избегаю (как выразилась ранеее) С++ на МК гарвардской архитектуры с объемом flash до 128 КБ (AVR почти все такие). В последнем случае "повторяемость" не достигает такого уровня, на котором деление классы и объекты давало бы ощутимую выгоду. В самом деле, нужно ли заводить класс, если его будет использовать только один единственный объект?

Но и в тех же случаях, когда "повторяемость" имеет место, организовать универсальный класс бывает слишком сложно. Скажем у МК есть 6 штук UART'ов (на разных портах), обмен с которыми организован одинаково. Казалось бы, такой обмен можно описать в виде класса, а затем на его основе создать объекты для каждого порта. Но не тут-то было! sm.gif Процедуры прерывания у каждого порта свои, и далеко не очевидно, как сделать так, чтобы объект для данного порта вписался в нужные адреса. И это на фоне того, что начинающие вообще не могут организовать процедуру прерывания, как функцию члена класса.

В том же случае, когда препоны такого рода все-таки удалось успешно преодолеть, оказывается, что время было потрачено на борьбу с языком C++, чтобы уломать его сделать очевидные вещи через ухо. sm.gif
dxp
QUOTE (Xenia @ Sep 6 2014, 17:10) *
Этот код красив только тем, что хорошо раскрашен в разные цвета sm.gif, но любителей простого C (а тем паче ассеблера!) такие конструкции приведут в ужас.

Дык это "5-й этаж" С++, кто заставляет туда лезть? Я вот сам обитаю в пределах "первых 3-х этажей", до пятого не дорос (но красоту и уровень уже оценить могу). Вам же предлагается зайти для начала на первый и походить там. Понравится, поднимайтесь на второй. Фишка плюсов в том, что средства, которые неуместны в той или иной задаче и/или не понимаются/не принимаются программистом, к использованию не обязательны. Что освоили, то и используем. И такой подход даёт безусловно выигрыш без побочных эффектов. Надо всегда это помнить и иметь в виду. Простое правило: "Не увлекаться, использовать только то, что освоено и есть чёткое понимание, что это, для чего и как применять".


QUOTE (Xenia @ Sep 6 2014, 18:48) *
В самом деле, нужно ли заводить класс, если его будет использовать только один единственный объект?

Имеет ли смысл заводить структуру, если она будет в единственном экземпляре? Имеет, т.к. это позволяет логически объединить данные, что упрощает оперирование с программными сущностями без оверхеда.

С классом всё ровно то же самое. Только профит ещё больше, т.к. класс сам по себе позволяет делать объекты более законченными.


QUOTE (Xenia @ Sep 6 2014, 18:48) *
Но и в тех же случаях, когда "повторяемость" имеет место, организовать универсальный класс бывает слишком сложно. Скажем у МК есть 6 штук UART'ов (на разных портах), обмен с которыми организован одинаково. Казалось бы, такой обмен можно описать в виде класса, а затем на его основе создать объекты для каждого порта. Но не тут-то было! sm.gif Процедуры прерывания у каждого порта свои, и далеко не очевидно, как сделать так, чтобы объект для данного порта вписался в нужные адреса. И это на фоне того, что начинающие вообще не могут организовать процедуру прерывания, как функцию члена класса.

У вас возникла проблема от недостатка опыта и понимания средств языка. Именно этот случай с UART'ами давно успешно решён, решение предлагалось на этом форуме - точно не помню, кто, кто-то из наших парней приводил (Сергей Борщ или AHTOXA, или оба sm.gif ).
A. Fig Lee
Цитата(Xenia @ Sep 6 2014, 07:48) *
Я же избегаю (как выразилась ранеее) С++ на МК гарвардской архитектуры с объемом flash до 128 КБ (AVR почти все такие). В последнем случае "повторяемость" не достигает такого уровня, на котором деление классы и объекты давало бы ощутимую выгоду. В самом деле, нужно ли заводить класс, если его будет использовать только один единственный объект?

Угу. На С++ бОльшая абстракция. Меньше контроль ресурсов, С более подходит для мелких.
Xenia
Цитата(dxp @ Sep 6 2014, 16:12) *
Дык это "5-й этаж" С++, кто заставляет туда лезть? Я вот сам обитаю в пределах "первых 3-х этажей", до пятого не дорос (но красоту и уровень уже оценить могу). Вам же предлагается зайти для начала на первый и походить там. Понравится, поднимайтесь на второй.

А я и на 5-ом этаже обитать могу sm.gif, но с существенной оговоркой - когда этот этаж МОЙ! Т.е. когда я сама его придумала и реализовала. Причем, не ради выпендрежа, а лишь только потому, что 4-х этажей для реализации идеи не хватило. Обычно 5-ти этажные конструкции не на конкретный проект бывают рассчитаны, а являются "заделом на будущее", и оттого имеют максимально абстрактный характер. А прошивка МК всегда конкретна, и именно поэтому едва ли стимулирует подниматься на высокие этажи.

Цитата(dxp @ Sep 6 2014, 16:12) *
У вас возникла проблема от недостатка опыта и понимания средств языка. Именно этот случай с UART'ами давно успешно решён, решение предлагалось на этом форуме - точно не помню, кто, кто-то из наших парней приводил (Сергей Борщ или AHTOXA, или оба sm.gif ).

Если возникает проблема, которую среди всего форума решили только два человека, то этот факт уже настораживает. Настораживает тем, что некое средство требует для своего использования определенных сверхспособностей, отсутствующих у большинства. Т.е. имеем случай, когда сама задача много проще, чем средства, которыми она решается. А оптимальной является ситуация, когда средства решения и сложность задачи примерно одного порядка.
Major
Цитата
Но и в тех же случаях, когда "повторяемость" имеет место, организовать универсальный класс бывает слишком сложно. Скажем у МК есть 6 штук UART'ов (на разных портах), обмен с которыми организован одинаково. Казалось бы, такой обмен можно описать в виде класса, а затем на его основе создать объекты для каждого порта. Но не тут-то было! sm.gif Процедуры прерывания у каждого порта свои, и далеко не очевидно, как сделать так, чтобы объект для данного порта вписался в нужные адреса. И это на фоне того, что начинающие вообще не могут организовать процедуру прерывания, как функцию члена класса.

Именно так и сделано у меня. Через классы и объекты.
Есть просто кольцевые буферы с использованием CLREX/STREXW (cortex-m3, STM32) для синхронизации. Получается семантика acqure/release.
Есть конечные автоматы для протоколов. Все сделано на шаблонах.
Авто генерация векторов прерываний через контеканацию строк (конфигурация в три строки). Уверяю, что все само, и не тормозит.
Этот код выложить не могу. Надо с заказчиком согласовывать, или переписать так чтобы код был отчуждаем.

А про "template<typename tobj_t> auto test_2(tobj_t& tobj, size_t tn) -> decltype(tobj(0))"
Это вы зря. В этой функции все равно что подается на вход, лишь бы callable. И ей не важно что будет на выходе, тип выводится автоматом.
Сначала написал код для C++11, где все само. Потом переделывал под C++98 для кейла.

Надеюсь это поможет кому-то принять верное решение (к C или C++).
По проектированию: Буч хорошо, но мало. Если дизайн, то Эванс (OOD). Но и этого мало. Только попо-часы и желательно в команде.

Kopa
Цитата(Major @ Sep 6 2014, 18:30) *
Надеюсь это поможет кому-то принять верное решение (к C или C++).

Для МК знать и применять ASM не возбраняется sm.gif (раз уж даже для PC есть ОС разрабатываемая на нём)
а мне лично Форта (Forth) за глаза хватает.
Xenia
Цитата(Kopa @ Sep 6 2014, 21:00) *
а мне лично Форта (Forth) за глаза хватает.


Форт использовать нельзя - в нем обратная польская запись! sm.gif
Kopa
Цитата(Xenia @ Sep 6 2014, 20:35) *
Форт использовать нельзя - в нем обратная польская запись! sm.gif

А Вы попробуйте sm.gif Или например Factor язык. Тогда будет предметный разговор без этих "страшилок"
Преимуществ в "польской" записи больше чем мнимых недостатков.

P.S. Некоторых задач вне использования Форт даже не представляю трудоёмкость и возможность их решения.
AHTOXA
Цитата(Major @ Sep 3 2014, 15:59) *
Могу переписать медиану, так чтобы был использован std::nth_element. Сравним.


Цитата(Major @ Sep 6 2014, 01:57) *
Вот ссылка на мой код: https://bitbucket.org/Glavny/medest/src
В Keil MDK-Lite 5.11 он работает в два раза быстрее чем код klen (в репозитории его нет. но если надо, могу выложить здесь).


Так у klen-а (сылка) тоже используется nth_element (class TMedianFilterNth).
А выигрыш, думаю, от того, что klen производит копирование всего массива при каждом вычислении медианы.
Major
Цитата
А выигрыш, думаю, от того, что klen производит копирование всего массива при каждом вычислении медианы.

Мысль ошибочная. Это проблема второго порядка малости (смотрел профайлером в MSVC и в Keil), оставить каждый-раз-копировать копирование рука не повернулась.
Основная идея состоит в том, чтобы использовать упорядоченную ранее последовательность (std::find).
Да и спор был не про скорость. А про качество кода и применимость С++.

Нет причин для того чтобы не использовать ++ (хотя бы шаблоны + STL) в разработке программ для МК.
Этот код на MSVC обгоняет код klen в пять раз (на N=64). Это означает, что с развитием общего знания о сортировках ваш код улучшается сам по себе. Использование STL: читаемость, портабельность, уверенность в безошибочности. Есть нюансы, но они обычно относятся к сложности алгоритмов и проблеме выбора контейнера.

Про "ни как причин", это я погорячился. Если это std, то нет причин не использовать алгоритмы, они как правило noexcept. В остальном надо думать.
Но если у вас при работе с контейнером возникает исключение (out of range например), то у вас и без std все плохо.
Я предпочитаю чисто статическую раскладку памяти. Так чтобы на момент старта программы все capacity были определены и в дальнейшем не происходило изменения емкости.
Есть такой документ (с участием Страуструпа) "JOINT STRIKE FIGHTER AIR VEHICLE C++ CODING STANDARDS FOR THE SYSTEM DEVELOPMENT AND DEMONSTRATION PROGRAM": http://www.stroustrup.com/JSF-AV-rules.pdf
Эти правила совсем жесткие, но к прочтению рекомендуются.


AHTOXA
Цитата(Major @ Sep 7 2014, 09:07) *
Основная идея состоит в том, чтобы использовать упорядоченную ранее последовательность (std::find).
Да и спор был не про скорость. А про качество кода и применимость С++.

Моя реплика была именно про скорость, остальной спор мне не особо интересен.
То есть, выигрыш от того, что на изначально упорядоченной последовательности std::nth_element отрабатывает быстрее?
Выходит, выигрыш чисто алгоритмический, а не от более правильного использования C++? sm.gif
Цитата(Major @ Sep 7 2014, 09:07) *
Но если у вас при работе с контейнером возникает исключение (out of range например), то у вас и без std все плохо.
Проблема не в возникновении исключений, а в их испоьзовании вообще. Как только появляется намёк на использование исключений, -- сразу же подтягиваются динамическое распределение памяти и куча нежелательного кода (по крайней мере в gcc). (Я тоже предпочитаю статическую раскладку).
AlexandrY
Цитата(Major @ Sep 5 2014, 22:57) *
Кому интересно (стр. 4).


Вот ссылка на мой код: https://bitbucket.org/Glavny/medest/src
В Keil MDK-Lite 5.11 он работает в два раза быстрее чем код klen (в репозитории его нет. но если надо, могу выложить здесь).
В MSVC на окне 64 в 5 раз быстрее.
Если компилировать для контейнера container_std_array_t, то даже std::vector не зацепится.



Неплохо, неплохо.
Вплотную приблизились к лучшим образцам на C-и.
Ну всего лишь в полтора раза проиграли алгоритму Ekstrom.



Код
----------------------------------------------
Algorithm 'Qsort' (standart C library ):
----------------------------------------------
Results CRC = 7CBB
Number of samplles   = 31
Number of iterations = 10000
Measured max. time(us)=64.1
Measured min. time(us)=0.2
Measured aver.time(us)=44.9

----------------------------------------------
Algorithm 'Shell' (http://electronix.ru/forum/index.php?s=&showtopic=114436&view=findpost&p=1181687):
----------------------------------------------
Results CRC = 7CBB
Number of samplles   = 31
Number of iterations = 10000
Measured max. time(us)=26.8
Measured min. time(us)=11.4
Measured aver.time(us)=17.2

----------------------------------------------
Algorithm 'Select' (Numerical Recipes in C, 8.5 Selecting the Mth Largest p.341):
----------------------------------------------
Results CRC = 7CBB
Number of samplles   = 31
Number of iterations = 10000
Measured max. time(us)=16.1
Measured min. time(us)=1.8
Measured aver.time(us)=5.6

----------------------------------------------
Algorithm 'Selip' (Numerical Recipes in C, 8.5 Selecting the Mth Largest p.343):
----------------------------------------------
Results CRC = 7CBB
Number of samplles   = 31
Number of iterations = 10000
Measured max. time(us)=46.8
Measured min. time(us)=17.3
Measured aver.time(us)=36.3

----------------------------------------------
Algorithm 'Xenia' (http://electronix.ru/forum/index.php?s=&showtopic=114436&view=findpost&p=1180687):
----------------------------------------------
Results CRC = 7CBB
Number of samplles   = 31
Number of iterations = 10000
Measured max. time(us)=37.9
Measured min. time(us)=1.5
Measured aver.time(us)=15.8

----------------------------------------------
Algorithm 'Neiver' (http://electronix.ru/forum/index.php?s=&showtopic=114436&view=findpost&p=1180944):
----------------------------------------------
Results CRC = 7CBB
Number of samplles   = 31
Number of iterations = 10000
Measured max. time(us)=15.8
Measured min. time(us)=2.7
Measured aver.time(us)=3.5

----------------------------------------------
Algorithm 'Ekstrom' (http://embeddedgurus.com/stack-overflow/tag/median-filter/):
----------------------------------------------
Results CRC = 7CBB
Number of samplles   = 31
Number of iterations = 10000
Measured max. time(us)=9.7
Measured min. time(us)=2.0
Measured aver.time(us)=2.8

----------------------------------------------
Algorithm 'Klen' (http://electronix.ru/forum/index.php?s=&showtopic=114436&view=findpost&p=1180679)
----------------------------------------------
Results CRC = 7CBB
Number of samplles   = 31
Number of iterations = 10000
Measured max. time(us)=63.5
Measured min. time(us)=12.6
Measured aver.time(us)=39.0

----------------------------------------------
Algorithm 'Major' (http://electronix.ru/forum/index.php?showtopic=122083&view=findpost&p=1278129
----------------------------------------------
Results CRC = 7CBB
Number of samplles   = 31
Number of iterations = 10000
Measured max. time(us)=12.6
Measured min. time(us)=3.8
Measured aver.time(us)=4.9

----------------------------------------------
Algorithm 'VAI' (http://caxapa.ru/170626.html):
----------------------------------------------
Results CRC = 7CBB
Number of samplles   = 31
Number of iterations = 10000
Measured max. time(us)=36.3
Measured min. time(us)=28.4
Measured aver.time(us)=29.2


Здесь использовался IAR C/C++ 6.50.6 на платформе Kinetis K70 (150 МГц, внутренняя RAM)

Понятно что мотивов переходить на C++ пока никаких.
Да, алгоритм nth_element неплох в составе C++, но что-то многовато обвязки чтобы его использовать.

А алгоритм KLEN оказался еще и непереносимым на RTOS, поскольку использовал статическую инициализацию вектора.
В окружении RTOS это вызывало аборт. Вектора в шаблонах то используют malloc. А он на этапе старта осью не поддерживается.
Т.е. резюме: кроме лишней писанины шаблоны C++ вызывают дополнительные проблемы портирования.
Major
Ради одного nth_element переходить на С++ даже вредно. Разговор не об этом.
По таблице: алгоритм Neiver надо исключить. Он не выдает честную медиану. То есть он фильтр, но не медианный.
Это видно на случайном потоке. Остальные образцы (кроме klen) не проверял на честность. Поэтому выражу обобщенное сомнение.
P.S. Ekstrom заценил, изящно сделано.

Добавлено:
По мотивам Ekstrom внес изменения в свой алгоритм. Скорость выросла на 41% (в Keil и MSVC одинаковый прирост).
На числовых объектов различий с Ekstrom нет (код в репозитории).
Потенциально, подход Ekstrom все равно лучше (stopper можно переделать).
В моем варианте двойное копирование объектов, и необходимо чтобы T имел операцию сравнения ==. По большому счету это УГ.
Я придумал как избежать эти две беды, но получится Ekstrom вывернутый мехом внутрь.
juvf
Цитата(Xenia @ Sep 6 2014, 17:48) *
Скажем у МК есть 6 штук UART'ов (на разных портах), обмен с которыми организован одинаково. Казалось бы, такой обмен можно описать в виде класса, а затем на его основе создать объекты для каждого порта. Но не тут-то было! sm.gif Процедуры прерывания у каждого порта свои, и далеко не очевидно, как сделать так, чтобы объект для данного порта вписался в нужные адреса. И это на фоне того, что начинающие вообще не могут организовать процедуру прерывания, как функцию члена класса.
Именно так и делаю. Процедуру прерывания не обязательно делать членом класса. Более того, была плата с разными интерфейсами (UART, CAN, SPI....), это не помешало сделать классы/объекты.

Цитата
Если возникает проблема, которую среди всего форума решили только два человека, то этот факт уже настораживает. Настораживает тем, что некое средство требует для своего использования определенных сверхспособностей, отсутствующих у большинства.
это вообще не проблема, и не нужно ни каких сверхспособностей.

Если 5-ый этаж проблема, чем 1-ый не устраивает? Если есть причины не использовать классы и шаблоны, почему нужно переходить на СИ? Чем с++ без ООП не устраивает?
ViKo
Что-то я не понял последних сообщений в дискуссии. Вы алгоритмами меряетесь или языками? Неужели на C++ можно написать более производительную программу, чем на C? Может, вернемся к ассемблеру? rolleyes.gif
AlexandrY
Цитата(Major @ Sep 7 2014, 16:04) *
По мотивам Ekstrom внес изменения в свой алгоритм. Скорость выросла на 41% (в Keil и MSVC одинаковый прирост).
На числовых объектов различий с Ekstrom нет (код в репозитории).


Что-то "не выходит каменный цветок" laughing.gif
Код
----------------------------------------------
Algorithm 'Major' (http://electronix.ru/forum/index.php?showtopic=122083&view=findpost&p=1278129
----------------------------------------------
Results CRC = 7CBB
Number of samplles   = 31
Number of iterations = 10000
Measured max. time(us)=65.5
Measured min. time(us)=0.0
Measured aver.time(us)=20.1


Хорошо хоть результат правильный.

Алгоритм Neiver действительно иногда дает неправильный результат (но достаточно редко), поэтому я его оставил.
Там наверно всего одно условие добавить надо, это удлинит его максимум на 0.1 мкс


Цитата(ViKo @ Sep 8 2014, 08:45) *
Что-то я не понял последних сообщений в дискуссии. Вы алгоритмами меряетесь или языками? Неужели на C++ можно написать более производительную программу, чем на C? Может, вернемся к ассемблеру? rolleyes.gif


Меряемся эффективностью, разве непонятно.
Эффективность это комплексный параметр.

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

Имеете что-то по ассемблеру? Давайте!

А то с чего это любители C++ так нервничают.
Он же такой мощный этот C++, красивей не бывает. А уж как он облегчает описание реального мира.
Сидели бы молча и хранили бы секрет своего могущества. biggrin.gif

Страуструп неплохой НЛП-шник, это надо признать. wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.