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

 
 
10 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Вопрос по С++
_Артём_
сообщение Dec 13 2011, 17:38
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Как бы правильно отработать такую ситуацию на С++:
Есть плата, на которую может устанавливаться два-три близких по системе команд GSM-модема (большинство нужных команд полностью идентичны).
Думаю делать так:
Создать класс содержащий все нужные функции (различающиеся команды объявить как виртуальные), от него создать нужное количество наследников с переопределёнными функциями и .
Тип модема может задаваьтся конфигурацией (байт в еепром) или определятся запросом версии AT-командой (предпочтительней).
А вот как дальше делать?
Как лучше объявить в программе переменную-наследника?
Компилятор IAR AVR.
Go to the top of the page
 
+Quote Post
neiver
сообщение Dec 13 2011, 18:38
Сообщение #2


Местный
***

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



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

Сообщение отредактировал neiver - Dec 13 2011, 18:39
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 13 2011, 18:49
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(neiver @ Dec 13 2011, 20:38) *
Если есть возможность использовать динамическую память , то вообще без проблем.


Не использовал пока динамическую память, нода смотреть как с этим в IAR AVR.

Цитата(neiver @ Dec 13 2011, 20:38) *
статический буфер достаточного размера, чтоб вместить самого большого наследника и placement new


Получается по смыслу что-то аналогичное Сишному union-у?
Go to the top of the page
 
+Quote Post
neiver
сообщение Dec 13 2011, 19:12
Сообщение #4


Местный
***

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



Цитата(_Артём_ @ Dec 13 2011, 22:49) *
Получается по смыслу что-то аналогичное Сишному union-у?

Нет. Просто статически выделяется буфер в памяти и в нем конструируется (с помощью конструктора) объект нужного типа.
Код
char buffer[MAX_BUFFER_SIZE]; // static array
...
class Base{...};
class D1 :public Base {...};
class D2 :public Base {...};
class D3 :public Base {...};
...

Base *ProduceObject(ObjectType type)
{
   switch(type)
   {
       case Type1: return new (buffer) D1(); // creating an object using palcement new
       case Type2: return new (buffer) D2();
       case Type3: return new (buffer) D3();
   }
}


Да, еще возможно придётся определить оператор new если он еще не определен:
Код
void *operator new(unsigned int size, void* ptr)
{
    return ptr;
}

В этом операторе можно что-то сделать с буфером памяти, обнулить его, например, а можно ничего не делать.

Сообщение отредактировал neiver - Dec 13 2011, 19:38
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 13 2011, 20:07
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(neiver @ Dec 13 2011, 21:12) *
Нет. Просто статически выделяется буфер в памяти и в нем конструируется (с помощью конструктора) объект нужного типа.
Код
char buffer[MAX_BUFFER_SIZE]; // static array
...
class Base{...};
class D1 :public Base {...};
class D2 :public Base {...};
class D3 :public Base {...};
...

Base *ProduceObject(ObjectType type)
{
   switch(type)
   {
       case Type1: return new (buffer) D1(); // creating an object using palcement new
       case Type2: return new (buffer) D2();
       case Type3: return new (buffer) D3();
   }
}


Да, еще возможно придётся определить оператор new если он еще не определен:
Код
void *operator new(unsigned int size, void* ptr)
{
    return ptr;
}

В этом операторе можно что-то сделать с буфером памяти, обнулить его, например, а можно ничего не делать.


Что-то всё равно не так.
Ввёл:
Код
char buffer[1000]; // static array

class Base {
public:
    unsigned int A;
    unsigned int N;
    void SetA(unsigned int a)
    {
        A=a;
    }
};
class D1 :public Base {
public:
    void *operator new(unsigned int size, void* ptr)
    {
    }
    void SetN()
    {
        N=0;
    }
};
class D2 :public Base {
public:
    void SetN()
    {
        N=1;
    }
};
class D3 :public Base {
public:
    void SetN()
    {
        N=2;
    }
};

Base *ProduceObject(unsigned char type)
{
    switch(type)
    {
    case 0: return new (buffer) D1(); // creating an object using palcement new
    case 1: return new (buffer) D2();
    case 2: return new (buffer) D3();
    }
}
int _tmain(int argc, _TCHAR* argv[])
{


    Base *p;
    p=ProduceObject(0);
    p->SetA(10);
}

Компилятор говорит:
Цитата
error C2660: 'operator new' : function does not take 2 arguments


Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 13 2011, 21:06
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (_Артём_ @ Dec 13 2011, 22:07) *
Что-то всё равно не так.
Так вы operator new объявили членом D2, а надо его сделать членом Base. А еще можно buffer и фабрику также спрятать внутрь base, сделав статическим членом и статической функцией соответственно.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 13 2011, 21:37
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Сергей Борщ @ Dec 13 2011, 23:06) *
Так вы operator new объявили членом D2, а надо его сделать членом Base.

Да, не заметил. Спасибо.

Цитата(Сергей Борщ @ Dec 13 2011, 23:06) *
А еще можно buffer и фабрику также спрятать внутрь base, сделав статическим членом и статической функцией соответственно.


Попробую.

Проверял в Visual Studio (ничего другого под рукой нет).
Как считаете в IAR AVR так же всё будет работать?
Go to the top of the page
 
+Quote Post
Danis
сообщение Dec 14 2011, 08:33
Сообщение #8


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Цитата(_Артём_ @ Dec 13 2011, 20:38) *
Создать класс содержащий все нужные функции (различающиеся команды объявить как виртуальные), от него создать нужное количество наследников с переопределёнными функциями и .
......


ИМХО, тут можно конечно сделать, но из за 2-x, 3-x подобных устройств использовать С++ со своими возможностями ООП (виртуальные функции и полиморфизм) Вам больше навредит, чем поможет. Сильно не рационально. С++ надо использовать только там, где это действительно необходимо и приемлемо, а не просто ради того чтоб использовать. Вот если бы подобных устройств было десятки, еще можно говорить….


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
neiver
сообщение Dec 14 2011, 08:51
Сообщение #9


Местный
***

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



Цитата(Danis @ Dec 14 2011, 12:33) *
ИМХО, тут можно конечно сделать, но из за 2-x, 3-x подобных устройств использовать С++ со своими возможностями ООП (вирртуальные функции и полиморфизм) вам больше навредит, чем поможет. Сильно не рационально. С++ надо использовать только там, где это действительно необходимо и рационально, а не просто ради того чтоб использовать. Вот если бы подобных устройств было десятки, еще можно говорить….

Поставленную задачу и проще и эффективнее решать именно с помощью виртуальных функций и полиморфизма и не важно сколько конкретно устройств имеется, их может быть более одного - этого уже достаточно.
К тому-же как это можно реализовать без полиморфизма?
С помощью таблиц функций? Вручную их заполнять нужными значениями и т.д. Получаются те-же виртуальные функции, только самописные и кривые - восход солнца вручную.
Вставлять в местах где поведение устройств ветвления по типу устройства? Еще более неудобно и черевато дополнительными ошибками.
Так, что выбранный путь очень даже рационален. Виртуальные функции дешевы и удобны.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 14 2011, 09:35
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Danis @ Dec 14 2011, 10:33) *
ИМХО, тут можно конечно сделать, но из за 2-x, 3-x подобных устройств использовать С++ со своими возможностями ООП (виртуальные функции и полиморфизм) Вам больше навредит, чем поможет. Сильно не рационально. С++ надо использовать только там, где это действительно необходимо и приемлемо, а не просто ради того чтоб использовать. Вот если бы подобных устройств было десятки, еще можно говорить….

В смысле?
Что значит "десятки устройств"?
Десятки типов устройств?
Или экземпляров?

Типов модулей может быть 2-3-..5..10(это точно перебор, да и 5 - перебор: 2-3, а дальше - много(слишком))
А модулей - сотни(чем больше тем лучше) каждого типа...

У как по-Вашему лучше сделать?

Цитата(Danis @ Dec 14 2011, 10:33) *
С++ надо использовать только там, где это действительно необходимо и приемлемо, а не просто ради того чтоб использовать


честный ответ - как глоток свежего воздуха...©
А где ж его использовать?(С++, в смысле)...?
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Dec 14 2011, 10:57
Сообщение #11


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(_Артём_ @ Dec 14 2011, 13:35) *
..А где ж его использовать?(С++, в смысле)...?


ну уж точно не в МК sm.gif покрайней мере пока не стоит в полной мере. а вот ООА необходимо юзать всегда. даже когда вы пишите на азме. при этом сама механизация того или иного функционала - уже вторично.

(круглый)
Go to the top of the page
 
+Quote Post
dxp
сообщение Dec 14 2011, 11:59
Сообщение #12


Adept
******

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



Цитата(kolobok0 @ Dec 14 2011, 17:57) *
ну уж точно не в МК sm.gif покрайней мере пока не стоит в полной мере.

Поясните, пожалуйста, какие именно аспекты С++ делают его нерекомендуемым для использования с МК?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Dec 16 2011, 08:23
Сообщение #13


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(dxp @ Dec 14 2011, 15:59) *
...какие именно аспекты С++ делают его нерекомендуемым для использования с МК?


для этого надо сначала понять, какие плюсы Вы видите в его использовании?

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

(круглый)
ЗЫ
Всегда надо идти от задачи. Лично мне не известны такие задачи где требуется си плас плас под МК. За исключением не анжинерных задач - типа попилить бабло. Но это мы не бум рассматривать надеюсь...
Go to the top of the page
 
+Quote Post
Danis
сообщение Dec 16 2011, 09:28
Сообщение #14


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Цитата(_Артём_ @ Dec 14 2011, 12:35) *
В смысле?
Что значит "десятки устройств"?
Десятки типов устройств?
Или экземпляров?


Разумеется типов, Вы же сами писали: "два-три близких по системе команд GSM-модема".

Цитата(_Артём_ @ Dec 14 2011, 12:35) *
У как по-Вашему лучше сделать?

На чистом Си, нет никаких проблем.


Не хочу переводить тему в категорию Си vs C++. Сам пишу софт в основном для ПК, на С++. В микроконтроллере мне С++ понадобился 1 раз, кода писал приложение для TFT панели, писал свой GUI. Тут С++ со своими возможностями ООП ”рулит”.


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
ReAl
сообщение Dec 16 2011, 09:57
Сообщение #15


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(kolobok0 @ Dec 16 2011, 10:23) *
Лично мне не известны такие задачи где требуется си плас плас под МК.
Лично мне не известны такие задачи, где требуется что угодно, кроме текстового редактора (набирать вручную HEX-файлы). Этого, в принципе, достаточно. Мнемокод — уже счастье. Ассемблер, да если еще и с макросами — рай земной.

нужно человеку буханка хлеба и четверть ведра воды в день, всего остального ему хочется» © забыл чей)


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

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

 


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


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