Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
sociodim
0 / 0 / 0
Регистрация: 28.10.2015
Сообщений: 2
#1

Разработать архитектуру программы управления роботом - C++

28.10.2015, 19:34. Просмотров 286. Ответов 2

Робот принимает команды типа "go north 1000", "turn left", "beep 5", "analyze oxygen", "analyze earth" и так далее. Архитектура должна предусматривать легкое добавление команд и описание допустимых операндов этих команд. Например, для "go" это "north", "west" и так далее, для "turn" - "left" и "right". Или "degrees", но тогда надо указать градусы. Просто куча if-ов не устраивает, надо красиво сделать. Видимо, тут нужен паттерн "Стратегия", а может и нет, я пока не придумал.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2015, 19:34     Разработать архитектуру программы управления роботом
Посмотрите здесь:

Пройденный роботом путь C++
Разработать проэкт управления телефоном C++
C++ Рекурсивный обход роботом плоской фигуры
Управление мобильным роботом, построенным на базе Pololu. C++
C++ Разработать класс с набором функций для управления односвязным списком
C++ Нужно написать три программы (Разработать класс Train)
C++ Задача на Архитектуру ПК
Как разработать автоматизированные тесты для программы? C++
Разработать программы C++
C++ Хочу понять архитектуру C++
Имеет ли смысл учить архитектуру ЭВМ программисту? C++
Разработать визуальное оформление для программы C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
5988 / 2428 / 436
Регистрация: 15.11.2014
Сообщений: 5,380
Завершенные тесты: 1
28.10.2015, 19:59     Разработать архитектуру программы управления роботом #2
Цитата Сообщение от sociodim Посмотреть сообщение
Видимо, тут нужен паттерн "Стратегия", а может и нет, я пока не придумал.
здесь нужен бинд имен команд на функции, которые эти команды реализуют.


например, вот мой консольный робот:

умеет три команды:

C++
1
2
3
void print(){ std::cout << "print()\n"; }
int add(int a, int b){ return a + b; }
int sub(int a, int b){ return a - b; }
соответственно,
умеет печатать текст,
складывать и вычитать значения.

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

http://rextester.com/NAENGJ62317

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <map>
#include <string>
#include <iostream>
#include <sstream>
#include <functional>
#include <stdexcept>
#include <type_traits>
 
//------------------------------------------------------------------------------------------------------//
 
    template<class Sig, class F>
        struct stream_function_;
 
    template<class R, class... Args, class F>
    struct stream_function_<R(Args...), F>
    {
        stream_function_(F f)
            : _f(f) 
        {}
 
        void operator()(std::istream& args, std::string* out_opt)const
            { call<R>(args, out_opt); }
 
    private:
        template<class T> static T get(std::istream& args)
        {
            T t; 
            if( !(args >> t) )
                args.clear(),
                throw std::invalid_argument("invalid argument to stream_function");
 
            return t;
        }
 
        #define dIS_VOID \
            std::is_same<U, void>::value
        #define dVOID    \
            typename std::enable_if<dIS_VOID, U>::type* = nullptr
        #define dRETURN  \
            typename std::enable_if<!dIS_VOID,U>::type* = nullptr
 
        template<class U, dVOID>
        void call(std::istream& args, std::string*) const
        {
            (void)args;
            _f( std::forward<Args>(get<Args>(args))... );
        }
 
        template<class U, dRETURN>
        void call(std::istream& args, std::string* out_opt) const
        {
            if(!out_opt) 
                return call<void>(args, nullptr);
 
            std::stringstream conv;
            conv << _f( std::forward<Args>(get<Args>(args))... );
            if(!conv)
                throw std::runtime_error("bad return in stream_function");
 
            *out_opt = conv.str();
        }
        #undef dIS_VOID 
        #undef dRETURN
        #undef dVOID
 
        F _f;
    };
 
    template<class Sig, class F>
    stream_function_<Sig, F> 
        stream_function(F f){ return f; }
 
    typedef std::function<void(std::istream&, std::string*)> 
        func_type;
    typedef std::map<std::string, func_type> 
        dict_type;
 
 
//------------------------------------------------------------------------------------------------------//
 
void print(){ std::cout << "print()\n"; }
 
int add(int a, int b){ return a + b; }
int sub(int a, int b){ return a - b; }
 
 
int main()
{
    dict_type func_dict;
    func_dict["print"] = stream_function<void()>(print);
    func_dict["add"]   = stream_function<int(int,int)>(add);
    func_dict["sub"]   = stream_function<int(int,int)>(sub);
 
    std::cout << "[ functions binded ]\n";
    for(const auto& i: func_dict)
        std::cout << " --- " << i.first<<'\n';
 
    std::cout << " enter 'exit' to exit\n";
 
    for(;;)
    {
        std::cout << "Which function should be called?\n";
        std::string tmp;
        std::cin >> tmp;
        
        std::cout << "selected: "<<tmp<<'\n';
 
        if(tmp=="exit")
            break;
 
        const auto it = func_dict.find(tmp);
 
        if(it == func_dict.end()){
            std::cout << "Invalid function '" << tmp << "'\n";
            continue;
        }
 
        try{
            std::string result;
            it->second(std::cin, &result);
            std::cout << "Result: " << (result.empty()? "none" : result) << '\n';
        }
        catch(std::exception const& e){
            std::cout << "Error: '" << e.what() << "'\n";
            std::cin.ignore();
            continue;
        }
        
    }
}
для того, что бы создать поддержку новой команды,
необходимо придумать ей текстовое имя (можно хоть на русском),
и сопоставить этому имени функцию,
которая будет реализовывать эту команду.


то бишь, непосредственно бинд происходит здесь:

C++
1
2
3
4
    dict_type func_dict;
    func_dict["print"] = stream_function<void()>(print);
    func_dict["add"]   = stream_function<int(int,int)>(add);
    func_dict["sub"]   = stream_function<int(int,int)>(sub);
обычный словарик.
ключ - имя команды.
значение - имя функции, с указанием типов аргументов и возвращаемого значения.
sociodim
0 / 0 / 0
Регистрация: 28.10.2015
Сообщений: 2
29.10.2015, 09:14  [ТС]     Разработать архитектуру программы управления роботом #3
А можно как-то попроще? Например, если все команды однотипные (принимают один параметр, возвращают bool, свидетельствующий об успехе или неуспехе, причем успех или неуспех определяется тем, является ли параметр разрешенным для данной операции). Я подумываю сделать класс Command, которые реализует некую абстрактную команду (т.е. список разрешенных параметров). Каждый раз, конструируя робота, надо будет указать все возможные команды (которые, в свою очередь, указывают все возможные параметры). Как-то так:

C++
1
2
3
4
5
6
7
Command go = new Command("go");
go.addOption("ahead");
Command turn = new Command("turn");
turn.addOption("left");
Robot robot = new Robot();
robot.addCommand(new Command(go));
robot.addCommand(new Command(turn));
Или что-то похожее, пусть и очень отдаленно. Я только начал изучать C++, да и в паттернах проектирования плаваю...
Yandex
Объявления
29.10.2015, 09:14     Разработать архитектуру программы управления роботом
Ответ Создать тему
Опции темы

Текущее время: 04:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru