|
Как писать на С++ при создание приложений под ARM, Примеры |
|
|
|
 |
Ответов
|
Jun 21 2011, 09:33
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046

|
согласен, обзор полностью верный. и применять тот или иной подход всегда надо к месту Цитата В связи с этим вопрос: не могли бы Вы привести примеры микроконтроллерных задач, в которых "объектно-ориентированный" подход даёт ощутимые преимущества? пример - графический юзверь-интерфейс. я какраз щас задачку ставить буду, где сложный gui, все на том же cortex-m3, QT там не пойдет, прийдется писать свой, тут и применю с++, посему и залез в эти темку
|
|
|
|
|
Jun 21 2011, 09:39
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(brag @ Jun 21 2011, 13:33)  пример - графический юзверь-интерфейс. я какраз щас задачку ставить буду, где сложный gui, все на том же cortex-m3, QT там не пойдет, прийдется писать свой, тут и применю с++, посему и залез в эти темку  При всём уважении, это голословное утверждение. Делал GUI (насколько сложный - тут мнения в любом случае разойдутся) именно "объектным" способом, никакой тяги к "полиморфизму" не ощутил. Отсюда и вопрос. Хотелось бы с обоснованием, где именно полиморфизм реально помогает.
|
|
|
|
|
Jun 21 2011, 11:58
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(scifi @ Jun 21 2011, 16:39)  При всём уважении, это голословное утверждение. Делал GUI (насколько сложный - тут мнения в любом случае разойдутся) именно "объектным" способом, никакой тяги к "полиморфизму" не ощутил. Отсюда и вопрос. Хотелось бы с обоснованием, где именно полиморфизм реально помогает. Это вы зря - GUI, как раз, то место, где ООП рулит в полный рост. Не знаю, как у вас было организовано, но типовая схема такая: все объекты GUI являются членами иерархии классов, где в базовых классах объявляются методы (т.е. виртуальные функции), назначение которых выполнять действия, сходные по назначению, но разные по реализации. Например, у нас есть объекты: главное меню, выпадающее/всплывающее меню, пункт меню, графическая кнопка, строка состояния и т.п., а так же есть органы управления прибором - несколько кнопок или небольшая [плёночная] клавиатура. Нам нужно организовать управление всем ворохом графических объектов, но сделать это как-то единообразно. К примеру, нужно обрабатывать кнопку Right (перемещение вправо). Для этого мы в базовом классе иерархии объявляем виртуальную (если в самом базовом, то кошерно её объявлять чисто виртуальной - pure virtual) функцю void right(). И во всех производных классах, где это необходимо, эта функция переопределяется, чтобы получить для каждого класса своё поведение. Например, при нажатии на эту кнопку, если фокус находится на главном меню, то курсор перемещается на следующий пункт главного меню. А если фокус находится на пункте выпадающего меню, то если пункт меню указывает на подменю, то открывается это подменю, в противном случае ничего не делается. А если фокус на строке состояния, то, скажем, это приводит к перемещению элементов строки состояния по кругу - самый правый уходит в самый левый, а остальные смещаются на одну позицию вправо. Словом, тут как требования задачи лягут и как фантазия позволит. Так вот, код для реализации этого будет до безобразия прост: Код TWidget *focus; // указатель на активный графический элемент (виджет)
...
focus = ...; // focus присваивается адрес графического элемента - как правило это присваивание происходит // внутри методов самих виджетов
...
if( is_key_clicked(GUI::KEY_RIGHT) { focus->right(); } И всё. Код, разделённый ... находится в разных местах программы. В частности, внутри функции right() фокус может получить другой адрес, чтобы следующие нажатия на кнопки управления обрабатывались уже другими объектами. Таким образом, достаточно написать не очень обширный код, где будет просто организован вызов одной (!) функции на каждый орган управления. А всё разнообразие поведения графических объектов уже будет реализовываться уже путём определения самих этих объектов. При такой схеме есть чёткое разделение назначения действия от его реализации, можно без труда добавлять новые виджеты, можно без страха и геморроя менять поведение существующих. И работает это эффективно и безошибочно. Другой пример, как уже сказали, - коммуникации. Я делал так приём пакетов по каналу управления: приходит пакет данных, надо его спровадить обработчику. Удобно обработчики выполнить в виде классов, у которых есть виртуальная функция, которая собсно и обрабатывает пришедшие данные. В самом входящем пакете в заголовке есть код, обозначающий тип пакета, заводим массив объектов классов, производных от одного базового абстрактного класса, заводим массив указателей на объекты-обработчики, инициализируем его адресами этих объектов (тут нужно проявить аккуратность). При приёме входящего пакета в обработчике прерываний декодируется заголовок и делается извлечение адреса из массива указателей и вызов метода обработчика. Это сильно похоже на аналогичный прием на С, когда заводится массив указателей на функции, но в данном случае есть удобство том, что объект-обработчик инкапсулирует в себе все необходимые сущности для работы. Кроме того, у объекта можно завести не один, а несколько методов, т.е. расширить это дело. В общем, в любом приложении, где есть общие по назначению, но разные по исполнению действия, уместно применять ООП - динамический полиморфизм отлично ложится на реализацию такой задачи.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jun 21 2011, 14:37
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(dxp @ Jun 21 2011, 15:58)  В общем, в любом приложении, где есть общие по назначению, но разные по исполнению действия, уместно применять ООП - динамический полиморфизм отлично ложится на реализацию такой задачи. Другими словами, средства полиморфизма из Си++ могут быть оправданы там, где на Си нужно было бы вводить "поле типа" или массив указателей на функции. Неудивительно, что у меня нет к этому тяги: в моих задачах это редко встречается :-) Ещё раз, спасибо за развёрнутое объяснение.
|
|
|
|
Сообщений в этой теме
Hellper Как писать на С++ при создание приложений под ARM Jun 18 2011, 20:15 Danis Цитата(Hellper @ Jun 19 2011, 00:15) Посо... Jun 18 2011, 20:21 scifi Цитата(Danis @ Jun 19 2011, 00:21) Доволь... Jun 18 2011, 20:53 zltigo QUOTE (Hellper @ Jun 18 2011, 23:15) тяну... Jun 18 2011, 20:36 haker_fox QUOTE (Hellper @ Jun 19 2011, 05:15) и тя... Jun 19 2011, 03:03 gladov Цитата(Hellper @ Jun 19 2011, 00:15) Посо... Jun 20 2011, 04:34 dxp Цитата(gladov @ Jun 20 2011, 11:34) С++ п... Jun 20 2011, 07:32  gladov Цитата(dxp @ Jun 20 2011, 11:32) Два, нет... Jun 21 2011, 06:40   dxp Вынужден категорически не согласиться по всем пунк... Jun 21 2011, 08:47    scifi Цитата(dxp @ Jun 21 2011, 12:47) Если вы ... Jun 21 2011, 09:21  777777 Цитата(dxp @ Jun 20 2011, 11:32) Почему в... Sep 22 2011, 04:49   andrewlekar Цитата(777777 @ Sep 22 2011, 10:49) О как... Sep 23 2011, 04:49    777777 Цитата(andrewlekar @ Sep 23 2011, 08:49) ... Sep 23 2011, 05:52     dxp Цитата(777777 @ Sep 23 2011, 12:52) Во-вт... Sep 23 2011, 07:02 haker_fox QUOTE (gladov @ Jun 20 2011, 13:34) и еще... Jun 20 2011, 08:07  MrYuran Цитата(haker_fox @ Jun 20 2011, 12:07) 3.... Jun 20 2011, 09:54 klen Цитата(gladov @ Jun 20 2011, 08:34) С++ п... Jun 20 2011, 10:45 Axel Цитата(gladov @ Jun 20 2011, 07:34) ...пр... Jun 20 2011, 11:22 demiurg_spb Цитата(Hellper @ Jun 19 2011, 00:15) Посо... Jun 20 2011, 11:35 Danis ТС, позвольте не большой, скромный вопрос к Вам. З... Jun 20 2011, 12:15 GDI ringbuffer-dlya-embedded - пример кода, и даже не ... Jun 20 2011, 13:11 Hellper Цитата(GDI @ Jun 20 2011, 17:11) ringbuff... Jun 20 2011, 16:05 brag Да, стоит сделать new, как c++ тянет библиотечный ... Jun 21 2011, 08:09  Axel Цитата(scifi @ Jun 21 2011, 12:39) ...где... Jun 21 2011, 10:14    Danis Цитата(scifi @ Jun 21 2011, 17:37) Другим... Jun 21 2011, 15:55 brag ЦитатаПри всём уважении, это голословное утвержден... Jun 21 2011, 10:30 Danis dxp, как у вас терпения хватает писать такие длинн... Jun 21 2011, 13:27 brag dxp, спасибо большое за обзорчик, вроде все и так ... Jun 21 2011, 22:18 haker_fox dxp, спасибо за шикарные ответы!!!
Н... Jun 22 2011, 01:05 andrewlekar Расказ про ООП конечно увлекательный, но стоит учи... Jun 22 2011, 04:57 MrYuran Цитата(andrewlekar @ Jun 22 2011, 08:57) ... Jun 22 2011, 06:38 dxp Цитата(andrewlekar @ Jun 22 2011, 11:57) ... Jun 22 2011, 06:40  andrewlekar ЦитатаПоясните? И причём тут множественное наследо... Jun 22 2011, 07:38   Danis Цитата(andrewlekar @ Jun 22 2011, 11:38) ... Jun 22 2011, 08:28   haker_fox По сравнению с уважаемым dxp, я вообще не программ... Jun 22 2011, 08:32    andrewlekar Цитата(haker_fox @ Jun 22 2011, 14:32) А ... Jun 22 2011, 09:00     MrYuran Цитата(andrewlekar @ Jun 22 2011, 13:00) ... Jun 22 2011, 09:32     shreck Цитата(andrewlekar @ Jun 22 2011, 16:00) ... Jun 22 2011, 10:34     SergeyDDD Цитата(andrewlekar @ Jun 22 2011, 12:00) ... Jun 22 2011, 11:22     haker_fox QUOTE (andrewlekar @ Jun 22 2011, 18:00) ... Jun 22 2011, 11:30      zltigo QUOTE (haker_fox @ Jun 22 2011, 14:30) Я ... Jun 22 2011, 12:33   Danis Цитата(andrewlekar @ Jun 22 2011, 11:38) ... Jun 22 2011, 08:37   sergeeff Цитата(andrewlekar @ Jun 22 2011, 10:38) ... Jun 22 2011, 08:44 Danis Цитата(andrewlekar @ Jun 22 2011, 08:57) ... Jun 22 2011, 06:53 haker_fox QUOTE (andrewlekar @ Jun 22 2011, 13:57) ... Jun 22 2011, 08:13 dxp . Jun 22 2011, 06:29 dxp Цитата(haker_fox @ Jun 22 2011, 08:05) Не... Jun 22 2011, 07:37 Dima_G Цитата(Hellper @ Jun 19 2011, 03:15) Таки... Jun 22 2011, 08:35 zltigo История моей жизни. Когда-то очень давно, когда ко... Jun 22 2011, 11:14 Danis Кстати, прорабатывается новая версия стандарта С++... Jun 22 2011, 11:31 MrYuran Цитата(Danis @ Jun 22 2011, 15:31) Кстати... Jun 22 2011, 11:45 brag Пописал немного кода на С++ использованием динамич... Sep 21 2011, 22:05 dxp Цитата(brag @ Sep 22 2011, 05:05) Про кон... Sep 22 2011, 07:25 777777 Цитата(dxp @ Sep 22 2011, 11:25) Правда? ... Sep 22 2011, 15:40 sergeeff КодПро конструкторы и деструкторы правда пришлось ... Sep 22 2011, 09:51 brag ЦитатаЧем же так конструкторы не угодили? Это прос... Sep 22 2011, 12:11 dxp Цитата(brag @ Sep 22 2011, 19:11) НО. Нек... Sep 22 2011, 13:03 ReAl Насколько я понимаю, вот тут конструктор object бу... Sep 22 2011, 12:32 brag ЦитатаНасколько я понимаю, вот тут конструктор obj... Sep 22 2011, 12:47 brag ЦитатаObject& GetObject()
{
static Object ... Sep 22 2011, 13:13 dxp Цитата(brag @ Sep 22 2011, 20:13) Хе, еще... Sep 22 2011, 13:19 brag ЦитатаБольшинство объектов в программе, как правил... Sep 22 2011, 13:32 sergeeff Цитата(brag @ Sep 22 2011, 16:32) init ни... Sep 22 2011, 13:37 brag ЦитатаЕстественно, это стандартная реализация иниц... Sep 22 2011, 13:41 Dima_G Компилятор ничего не знает о потоках, процессах и ... Sep 22 2011, 14:38 brag ЦитатаКомпилятор ничего не знает о потоках, процес... Sep 22 2011, 15:05 Dima_G Цитата(brag @ Sep 22 2011, 22:05) Qt+gcc ... Sep 22 2011, 15:16 sergeeff Цитата(brag @ Sep 22 2011, 18:05) Qt+gcc ... Sep 22 2011, 15:21 brag ЦитатаЛично налетал на гонки в синглтоне. Компилят... Sep 22 2011, 16:09 Dima_G Цитата(brag @ Sep 22 2011, 23:09) а реали... Sep 23 2011, 04:30 brag еще вопрос по поводу реюза кода. Как, на пример, в... Sep 22 2011, 17:45 AHTOXA Цитата(brag @ Sep 22 2011, 23:45) Нужно, ... Sep 22 2011, 18:32 brag а код? -ffunction-sections , а потом это все вручн... Sep 22 2011, 18:44 brag Реализовал через манипуляцию ld -r, линкер-скрипты... Sep 22 2011, 22:54 dxp Цитата(777777 @ Sep 22 2011, 22:40) Что з... Sep 23 2011, 04:50 brag Цитатаочитайте про "Placement new". Это ... Sep 23 2011, 10:15 MALLOY2 Ссылка в тему С++ & Cortex Sep 23 2011, 11:35 brag Хe, и множественному наследованию (по крайней мере... Sep 23 2011, 16:25 andrewlekar Множественное наследование от интерфейсов разумеет... Sep 23 2011, 17:22 BlackHead Вот набрёл на библиотеку С++
http://xpcc.sourcefor... Oct 5 2011, 10:21 kikos Лет 20 назад один из заказчиков (пожилой американс... Oct 31 2011, 13:32 Сергей Борщ QUOTE (kikos @ Oct 31 2011, 16:32) На воп... Oct 31 2011, 13:49  Forger Цитата(Сергей Борщ @ Oct 31 2011, 17:49) ... Oct 31 2011, 18:14 ReAl Цитата(kikos @ Oct 31 2011, 15:32) Более ... Nov 1 2011, 06:27 IgorKossak Господа критикующие, напоминаю, тема звучит Как пи... Nov 1 2011, 08:32 brag Как можно реализовать такую вещ без кривоты, rtti,... Dec 10 2011, 02:55 Forger Цитата(brag @ Dec 10 2011, 06:55) Как мож... Dec 10 2011, 07:09 alx2 Цитата(brag @ Dec 10 2011, 07:55) Как мож... Dec 11 2011, 10:37 neiver Массив указателей на объекты базового класса - это... Dec 10 2011, 07:29 brag ЦитатаДля полноты картины, расскажите, для чего ва... Dec 10 2011, 15:37 dxp Цитата(brag @ Dec 10 2011, 22:37) массив ... Dec 10 2011, 17:39 brag ЦитатаЕсли я правильно понял, что требуется работа... Dec 10 2011, 18:11 dxp Цитата(brag @ Dec 11 2011, 01:11) stl не ... Dec 10 2011, 21:44 brag да просто проект такой, что проще свое написать, ч... Dec 10 2011, 22:59 kan35 Писать на С++ под ARM точно так же как на любую др... Dec 11 2011, 09:52 brag Спасибо.
но это тоже не то, массив указателей все ... Dec 11 2011, 13:32
2 страниц
1 2 >
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|