Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
2 / 2 / 0
Регистрация: 04.11.2013
Сообщений: 101

Код для C++11 в VS2010. Boost

03.10.2018, 13:00. Показов 1205. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня!

Пытаюсь использовать кольцевой буфер отсюда:
https://github.com/embeddedart... buffer.cpp

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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <cstdio>
 
#include <memory>
#include <mutex>
 
template <class T>
class circular_buffer {
public:
    explicit circular_buffer(size_t size) :
        buf_(std::unique_ptr<T[]>(new T[size])),
        max_size_(size)
    {
 
    }
 
    void put(T item)
    {
        std::lock_guard<std::mutex> lock(mutex_);
 
        buf_[head_] = item;
 
        if(full_)
        {
            tail_ = (tail_ + 1) % max_size_;
        }
 
        head_ = (head_ + 1) % max_size_;
 
        full_ = head_ == tail_;
    }
 
    T get()
    {
        std::lock_guard<std::mutex> lock(mutex_);
 
        if(empty())
        {
            return T();
        }
 
        //Read data and advance the tail (we now have a free space)
        auto val = buf_[tail_];
        full_ = false;
        tail_ = (tail_ + 1) % max_size_;
 
        return val;
    }
 
    void reset()
    {
        std::lock_guard<std::mutex> lock(mutex_);
        head_ = tail_;
        full_ = false;
    }
 
    bool empty() const
    {
        //if head and tail are equal, we are empty
        return (!full_ && (head_ == tail_));
    }
 
    bool full() const
    {
        //If tail is ahead the head by 1, we are full
        return full_;
    }
 
    size_t capacity() const
    {
        return max_size_;
    }
 
    size_t size() const
    {
        size_t size = max_size_;
 
        if(!full_)
        {
            if(head_ >= tail_)
            {
                size = head_ - tail_;
            }
            else
            {
                size = max_size_ + head_ - tail_;
            }
        }
 
        return size;
    }
 
private:
    std::mutex mutex_;
    std::unique_ptr<T[]> buf_;
    size_t head_ = 0;
    size_t tail_ = 0;
    const size_t max_size_;
    bool full_ = 0;
};
 
int main(void)
{
    circular_buffer<uint32_t> circle(10);
    printf("\n === CPP Circular buffer check ===\n");
    printf("Size: %zu, Capacity: %zu\n", circle.size(), circle.capacity());
 
    uint32_t x = 1;
    printf("Put 1, val: %d\n", x);
    circle.put(x);
 
    x = circle.get();
    printf("Popped: %d\n", x);
 
    printf("Empty: %d\n", circle.empty());
 
    printf("Adding %zu values\n", circle.capacity() - 1);
    for(uint32_t i = 0; i < circle.capacity() - 1; i++)
    {
        circle.put(i);
    }
 
    circle.reset();
 
    printf("Full: %d\n", circle.full());
 
    printf("Adding %zu values\n", circle.capacity());
    for(uint32_t i = 0; i < circle.capacity(); i++)
    {
        circle.put(i);
    }
 
    printf("Full: %d\n", circle.full());
 
    printf("Reading back values: ");
    while(!circle.empty())
    {
        printf("%u ", circle.get());
    }
    printf("\n");
 
    printf("Adding 15 values\n");
    for(uint32_t i = 0; i < circle.size() + 5; i++)
    {
        circle.put(i);
    }
 
    printf("Full: %d\n", circle.full());
 
    printf("Reading back values: ");
    while(!circle.empty())
    {
        printf("%u ", circle.get());
    }
    printf("\n");
 
    printf("Empty: %d\n", circle.empty());
    printf("Full: %d\n", circle.full());
 
    return 0;
}
Вынужден использовать VS2010, из-за чего есть проблемы при компиляции. Часть ошибок убрал добавлением библиотек из Boost, в частности boost\thread\mutex.hpp. Остались только ошибки с кодом C2864:

tail_: в пределах класса могут быть инициализированы только статические константные данные-члены целого типа
full_: ...
head_: ...

Вот здесь:

C++
1
2
3
4
5
6
7
8
private:
    std::mutex mutex_;
    std::unique_ptr<T[]> buf_;
    size_t head_ = 0;
    size_t tail_ = 0;
    const size_t max_size_;
    bool full_ = 0;
};
Пробовал подключать библиотеку boost\mpl\size_t.hpp, не помогло.

Прошу Вашей помощи.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.10.2018, 13:00
Ответы с готовыми решениями:

Не работает регэкс, содержащий ", VS2010, boost 1.52.0
VisualStudio 2010, boost 1.52.0. При попытке поиска по регэкспу &quot;(?&lt;=HandleId\&quot;\&gt;).*(?=\&lt;\/Data\&gt;)&quot; ничего не находится! текст, по которому...

Код С++ 6.0 запустить в Vs2010
Я совсем новичок (9 дней), скачал кучу книжек для изучения С++ и вот какая проблема: в книгах приведены примеры для С++ 6.0 , у Петцолда...

как записать код задачи VS2010
Добрый вечер, я тут новенькая) дана дробь, наметки кода: #include &quot;StdAfx.h&quot; #include &lt;iostream&gt; #include...

5
166 / 109 / 57
Регистрация: 30.08.2018
Сообщений: 357
03.10.2018, 13:34
Можно посмотреть список возможностей VS2010
https://msdn.microsoft.com/ru-... 67368.aspx

Добавлено через 2 минуты
Цитата Сообщение от Teterichev Посмотреть сообщение
в пределах класса могут быть инициализированы только статические константные данные-члены целого типа
нет поддержки "Инициализаторы нестатических элементов данных"

То есть, посмотреть что такое "Инициализаторы нестатических элементов данных"http://www.open-std.org/jtc1/s... /n2756.htm
и переписать под себя
As a simple example,

C++
1
2
3
4
  class A {
    public:
        int a = 7;
    };
would be equivalent to

C++
1
2
3
4
 class A {
    public:
        A() : a(7) {}
    };
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
03.10.2018, 14:13
Teterichev, а мьютекс-то вам точно нужен?
Зачастую - это неудачное решение, когда синхронизация зашивается внутрь контейнера.

Добавлено через 5 минут
Teterichev,
Кликните здесь для просмотра всего текста

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
#include <cassert>
#include <cstddef>
 
template <typename T>
class circular_buffer
{
public:
    explicit circular_buffer(std::size_t size)
        : m_maxsize(size)
        , m_buf(new T[size])
        , m_head(), m_tail()
        , m_full()
    { }
    ~circular_buffer()
    {
        delete[] m_buf;
    }
 
    void put(T const & item)
    {
        m_buf[m_head] = item;
 
        if(full())
        {
            m_tail = (m_tail + 1) % m_maxsize;
        }
        m_head = (m_head + 1) % m_maxsize;
        m_full = (m_head == m_tail);
    }
 
    T get()
    {
        assert(!empty());
 
        T & val = m_buf[m_tail];
        m_full = false;
        m_tail = (m_tail + 1) % m_maxsize;
        return val;
    }
 
    void reset()
    {
        m_head = m_tail;
        m_full = false;
    }
 
    bool empty() const
    {
        return !full() && (m_head == m_tail);
    }
 
    bool full() const
    {
        return m_full;
    }
 
    std::size_t capacity() const
    {
        return m_maxsize;
    }
 
    std::size_t size() const
    {
        if(!full())
        {
            int diff = (m_head - m_tail);
 
            return (m_head >= m_tail) ? diff : capacity() + diff;
        }
        return capacity();
    }
 
private:
    circular_buffer(circular_buffer const &);
 
private:
    std::size_t const m_maxsize;
 
    T * m_buf;
 
    std::size_t m_head;
    std::size_t m_tail;
 
    bool m_full;
};
2
2 / 2 / 0
Регистрация: 04.11.2013
Сообщений: 101
03.10.2018, 14:20  [ТС]
DrOffset, это то же самое, только минуя мьютекс?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
03.10.2018, 14:37
Цитата Сообщение от Teterichev Посмотреть сообщение
это то же самое, только минуя мьютекс?
Это тоже самое, минус mutex и минус C++11.
1
2 / 2 / 0
Регистрация: 04.11.2013
Сообщений: 101
03.10.2018, 14:38  [ТС]
DrOffset, большое Вам спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.10.2018, 14:38
Помогаю со студенческими работами здесь

C# VS2010 мот кто скинит книгу или ссылку даст на скачку?? (vs2010 rus)
C# VS2010 мот кто скинит книгу или ссылку даст на скачку?? (vs2010 rus)

Как перенести код с проекта VS2012 в проект VS2010?
Как перенести код с проекта visual studio 2012 в проект на visual studio 2010?

Boost Test. Массивы - разобрать код
Помогите разобраться с Boost Test. Вообще не понятно как и что работает. И можно ли вообще протестировать эти функции: #include...

Как скомпилировать код с boost в ubuntu
Есть вот такой код: #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;boost/regex.hpp&gt; #include &lt;set&gt; #include &lt;vector&gt; ...

Для QT в VS2010-2012-2013, для Изменения Языков в QT Предлагаю утилиту
Для QT в VS2010-2012-2013 для Изменения Языков Предлагаю утилиту Распаковываем архив Qt_langs.rar там набор файлов , читайте...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru