Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/40: Рейтинг темы: голосов - 40, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 29.02.2020
Сообщений: 39

Что будет если добавить элемент в кольцевой буфер n+1 больший, чем размер буфера?

27.05.2020, 05:47. Показов 8754. Ответов 77

Студворк — интернет-сервис помощи студентам
Что будет если добавить элемент в кольцевой буфер n+1 больший, чем размер буфера?


Кольцевой буфер емкостью 1024 вещественных числа. Доступ к
элементам буфера – как к элементам очереди. Обязательны функции-члены
класса для инициализации буфера, добавления/удаления элемента, определения
количества свободного/занятого пространства в буфере.


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
using namespace std;
#include<iostream> 
class CircularBuffer {
private:
    int* _data;          // Хранимые данные.
    int     _size;          // Размер циклического буффера.
    int     _freeSpace;     // Свободное метос в буффере.
    int     _occupiedSpace; // Занятое мето.
 
public:
    CircularBuffer();
    ~CircularBuffer();
 
    // Метод, возвращающий свободное место.
    int GetFreeSpace() { return _size - _occupiedSpace; }
 
    // Метод, возвращающий занятое место.
    int GetOccupiedSpace() { return _occupiedSpace; }
 
    // Метод добавления элемента в буффер.
    void Add(int val);
 
    // Метод достающий элемент из очереди (с последующим его выталкиванием).
    int Get();
};
 
int main(int argc, char** argv)
{
    // Создаем экземпляр класса.
    CircularBuffer c;
    int count = 10;
 
    // Заполним очередь от 1 до 10 с выводом текущего стояния буффера.
    for (int i = 1; i <= count; ++i) {
        c.Add(i);
        cout << "Fress space: " << c.GetFreeSpace() << "; Occupied: " << c.GetOccupiedSpace() << endl;
    }
 
    // Очистим очередь от 1 до 10 с выводом текущего стояния буффера.
    for (int i = 0; i < count; ++i) {
        cout << "Get next: " << c.Get() << endl;
        cout << "Fress space: " << c.GetFreeSpace() << "; Occupied: " << c.GetOccupiedSpace() << endl;
    }
 
    return 0;
}
 
CircularBuffer::CircularBuffer()
{
    // Инициализация мета под буффер.
    _size = 1024;
    _data = new int[_size];
    // Сборс внутреннего состояния всех полей.
    _freeSpace = _size;
    _occupiedSpace = 0;
}
 
CircularBuffer::~CircularBuffer()
{
    delete[] _data;
} // Не забываем осободить выделенную в конструкторе память.
 
void CircularBuffer::Add(int val)
{
    _data[_occupiedSpace++ % _size] = val;
}  // Устанавивливаем соотв. элемент согласно правилу заполнения циклического буффера.
 
int CircularBuffer::Get()
{
    // Проверка на пустоту буффера.
    if (_occupiedSpace == 0)
        throw "Buffer is empty";    // Борсаем исключение, в случае попытки вытолкнуть из пустой очереди.
 
    int res = _data[0]; // Запоминаем первостоящего в очереди.
    // Сдвигаем очередь на одну позицию вперед.
    for (int i = 1; i < _occupiedSpace; ++i)
        _data[i - 1] = _data[i];
    // Корректируем размер.
    --_occupiedSpace;
    return res; // Возвращаем первый элемент.
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.05.2020, 05:47
Ответы с готовыми решениями:

Почему GetTokenInformation возвращает буфер больший, чем затребованная структура?
Здравствуйте! Помогите, пожалуйста, понять. Беру GetTokenInformation. Затребую тип инфы - TokenUser. Функция говорит, что нужен...

Что будет если в размер массива отправить 0?
Что будет если создать динамический массив int SIDE; int *arr = new int; И ввести SIDE = 0, то что происходит? Объясните...

Что будет иметь больший вес для ПС
в футере на главной странице решил поставить пару ключей. Как лучше оформить их? как ссылку на эту же страницу или как &lt;h4&gt;

77
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
12.05.2021, 10:44
Студворк — интернет-сервис помощи студентам
разницу я понимаю я не понимаю следующее
Цитата Сообщение от DrOffset Посмотреть сообщение
Если вам нужно, чтобы объект был создан в static-функции, а продолжил меняться в main
нет мне нужно создать объект в main а потом менять его в статике...? без передачи его как аргумента статику

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В языке С++ (до появления inline переменных) вообще не существует способа определить статический член класса "внутри описания"
как же а const ..
сори я запутался и вас запутал, я просто больше С++11 а вы в ногу со временем... итого еще раз если inline static то можно внутри но только начиная с версии 17. если const static то можно внутри в любой версии. в остальных случаях только вне класса надо определять. спасибо. осталось только не забыть и не запутаться.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,350
12.05.2021, 11:31
Цитата Сообщение от alexbmd Посмотреть сообщение
как же а const ..
сори я запутался и вас запутал, я просто больше С++11 а вы в ногу со временем... итого еще раз если inline static то можно внутри но только начиная с версии 17. если const static то можно внутри в любой версии. в остальных случаях только вне класса надо определять. спасибо. осталось только не забыть и не запутаться.
Варианты без inline не являются определениями. static const внутри класса - это объявление, но не определение. По-моему я уже об этом говорил.
0
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
12.05.2021, 12:28
Цитата Сообщение от alexbmd Посмотреть сообщение
нет мне нужно создать объект в main а потом менять его в статике...? без передачи его как аргумента статику
Это какое-то противоестественное желание.
Вы же и в случае обычных нестатических функций передаете этот аргумент. Зачем же static нужно так обижать?
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
13.05.2021, 09:08
DrOffset, я еще не постиг дзэнь

"Вы же и в случае обычных нестатических функций передаете этот аргумент." - я не передаю, компилятор передаёт. яже просто пишу obj.fn(); без аргумента ... я просто не люблю писать длиный код поэтому всегда ищю варианты короткой записи того что пишется длинно , такой мозг

TheCalligrapher,
C++
1
2
3
4
class A{
inline static c17 = 17; //объявление или определение ?
static const c = 98;  //объявление или определение ?
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,350
13.05.2021, 10:08
Цитата Сообщение от alexbmd Посмотреть сообщение
C++
1
2
3
4
class A{
inline static c17 = 17; //объявление или определение ?
static const c = 98;  //объявление или определение ?
}
Тип где?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// C++17
 
struct S
{
  inline static int a = 17; // Определение 
  static const int b = 98; // Объявление, но не определение
};
 
int main()
{
  const int *pa = &S::a; // Все в порядке
 
  int array[S::b]; // Все в порядке - для такого использования определение не нужно
 
  const int *pb = &S::b; // Ошибка линкера - не хватает определения
}
1
 Аватар для Kuzia domovenok
4268 / 3328 / 926
Регистрация: 25.03.2012
Сообщений: 12,545
Записей в блоге: 1
13.05.2021, 11:04
TheCalligrapher, ты забыл объявить под определением структуры int S::a, S::b;
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,350
13.05.2021, 11:22
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ты забыл объявить под определением структуры int S::a, S::b;
Я ничего не забыл. Я же подробно все описал в своем ответе.

Ни о каком дополнительном "объявлении" S::a не может быть и речи.

Что касается S::b - в ответе все ясно написано.
0
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
13.05.2021, 13:48
Цитата Сообщение от alexbmd Посмотреть сообщение
- я не передаю, компилятор передаёт. яже просто пишу obj.fn(); без аргумента
Вы вполне конкретно указываете объект, для которого нужно вызвать метод. Значит передаете, явно передаете. Конкретный синтаксис не играет роли, за синтаксисом постарайтесь увидеть концепцию.

Более того, в разное время от разных людей в С++ были предложения по унификации синтаксиса вызова, именно по причине общности концепции.
Вот от Герба Саттера: http://www.open-std.org/jtc1/s... /n4165.pdf
Вот от Страуструпа: http://www.open-std.org/jtc1/s... /n4174.pdf
Вот от них обоих: http://www.open-std.org/jtc1/s... /n4474.pdf

Еще вариант: http://www.open-std.org/jtc1/s... /n1585.pdf
Еще вариант: http://www.open-std.org/jtc1/s... 0079r0.pdf

Цитата Сообщение от alexbmd Посмотреть сообщение
я просто не люблю писать длиный код поэтому всегда ищю варианты короткой записи того что пишется длинно , такой мозг
Даже если вы очень любите забивать гвозди, иногда нужно будет и заворачивать шурупы. Аналогия ясна?
1
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
21.05.2021, 13:55
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ошибка линкера - не хватает определения
в жисть не догодался бы что это ошибка и что надо отдельно определять так?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// C++17
 struct S
{
  inline static int a = 17; // Определение 
  static const int b = 98; // Объявление, но не определение
};
 int S::b = 99;
int main()
{
  const int *pa = &S::a; // Все в порядке
   int array[S::b]; // Все в порядке - для такого использования определение не нужно
   const int *pb = &S::b; // 
}
Добавлено через 15 минут
TheCalligrapher, маленький вопрос
если в заголовочном файле у нас идёт "длиное" описание (кроме возвр.типа еще доп ключевые слова) например не просто int Fn() а чтото длиное static inline int Fn(int);
_то_
в основном файле когда идёт уже определение всю эту длиную запись надо обезательно повторять или можно просто короткий какой вариант например int Class::Fn(int i){..}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,350
21.05.2021, 14:38
Цитата Сообщение от alexbmd Посмотреть сообщение
так?
Почти так. Во-первых, в данном случае const int S::b;. Во-вторых, инициализатор для S::b должен быть указан только один раз: либо в объявлении, либо в определении. И там, и там - нельзя.

Цитата Сообщение от alexbmd Посмотреть сообщение
в основном файле когда идёт уже определение всю эту длиную запись надо обезательно повторять или можно просто короткий какой вариант
Если речь идет о статическом члене класса, то в определении слово static повторять нельзя - будет ошибка.

Слово inline можно повторять, а можно и не повторять.

Все остальное, т.е. то, что касается типа сущности, нужно повторять.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
21.05.2021, 18:14
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Слово inline можно повторять, а можно и не повторять.
я попробовал в С++11 повторить выдало ошибку пришлось в хэдере убрать.
и получилось вот так . но всёравно выдаёт ошибку. подскажите плиз что я сделал не так?

PS: на вопрос 2 и 3 (из линка) получается вы ответили, в последних трёх абзацах. статик/инлайн нюансы, а остальное всё обязаны повторять.
0
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
21.05.2021, 20:59
Цитата Сообщение от alexbmd Посмотреть сообщение
выдаёт ошибку
Ошибка линковки, которую вы получаете, в данном случае не имеет никакого отношения к вопросу "можно ли повторять".
Необходимость повторять\не повторять - это вопрос разрешающийся на этапе компиляции.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
11.08.2021, 22:47
TheCalligrapher,
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
#include <stdio.h>
#include <inttypes.h>
int UDR0 = 32;
 
class Buf  {
    // inline member function should be defined in header
  private:
    typedef uint8_t T;
    const T rx_buffer_size = 16;
    const T rx_mask = rx_buffer_size - 1;
    T rx_buffer[rx_buffer_size] = {0};
    volatile T rx_head = 0;
    volatile T rx_tail = 0;
 
  public:
    inline bool receive() {
      if ((T)(rx_head - rx_tail) < rx_buffer_size) {
        rx_buffer[rx_head++ & rx_mask] = UDR0;
        return true;
      }
      return false;
    }
 
    inline T read() {
      return rx_tail == rx_head ? 0 : rx_buffer[rx_tail++ & rx_mask];
    }
 
};
 
Buf ring;
 
 
int main()
{
    for (;UDR0++ < 42; ) {
        ring.receive();
    }
    
    for (int i=0;i < 10;i++ ) {
        putchar(ring.read());
    }
 
}
чтото я запутался. объясните плиз почему если rx_buffer_size и rx_mask не статик то выдаёт ошибку error: invalid use of non-static data member ‘Buf::rx_buffer_size’
у нас же функции члены не статики зачем им статик дата члены
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,350
11.08.2021, 23:02
Цитата Сообщение от alexbmd Посмотреть сообщение
бъясните плиз почему если rx_buffer_sizeи rx_maskне статик то выдаёт ошибку error: invalid use of non-static data member ‘Buf::rx_buffer_size’
Почему вы написали "rx_buffer_sizeи rx_mask", если ошибка относится только к rx_buffer_size? Зачем вы упомянули rx_mask?

Размер в объявлении массива в С++ не может задаваться нестатическим членом класса. Нестатический член класса не является константным выражением.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
12.08.2021, 17:20
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Зачем вы упомянули rx_mask?
ну там у меня еще было static_assert((rx_buffer_size & rx_mask) == 0, "buffer size must be a power of 2"); которому маск статический нужен тоже оказывается

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Нестатический член класса не является константным выражением.
хм.. даже несмотря на атрибут конст ?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,350
12.08.2021, 17:59
Цитата Сообщение от alexbmd Посмотреть сообщение
хм.. даже несмотря на атрибут конст ?
Разумеется, несмотря. А что const? Это constexpr обеспечивает константность выражения. А const в этом плане сам по себе не обеспечивает ничего вообще.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
12.08.2021, 19:32
TheCalligrapher, так что они от нас хотят
конст это если я правильно понял нужно больше для програмиста, ну типо чтоб случайно гдето в коде не изменил переменную ?

а тут компилятор хочет констекспр или статик конст чтобы что ? почему его не устраивает конст ? конст ведь тоже не изменная величина и компилятор мог бы её скушать
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,350
12.08.2021, 19:48
Цитата Сообщение от alexbmd Посмотреть сообщение
конст это если я правильно понял нужно больше для програмиста, ну типо чтоб случайно гдето в коде не изменил переменную ?
const изначально взял на себя много разных ролей. Фактический эффект const зависит от контекста. В С++ это может быть константа времени компиляции, а может и не быть константа времени компиляции.

Цитата Сообщение от alexbmd Посмотреть сообщение
почему его не устраивает конст ? конст ведь тоже не изменная величина и компилятор мог бы её скушать
Какая же она "неизменная"? В варианте

C++
1
2
3
4
struct S
{
  const int i = 42;
};
значение 42 - это лишь инициализатор по умолчанию. Такой вариант является не более чем сокращенной формой записи для

C++
1
2
3
4
5
6
struct S
{
  const int i;
 
  S() : i(42) {}
};
(это не совсем точно, но для наших целей - достаточно точно).

Никто вам не запрещает написать в таком классе свой конструктор с другим инициализатором

C++
1
2
3
4
5
6
7
8
struct S
{
  const int i = 42;
 
  S() = default;
  S(double) : i(123) {}
  S(int) : i(std::rand()) {}
};
Поэтому чему будет фактически равно значение нестатического const поля S::i компилятор заранее знать не может.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.08.2021, 19:48

Если исходный файл имеет размер больший или равный 10 - выбрать из него только первые 10 элементов
№1 Дан файл целых чисел. Создать на его основе новый файл, размером в 10 элементов. Если исходный файл имеет размер больший или равный 10 -...

Сокет принял данных больше, чем размер буфера
Этот вопрос скорее всего относиться не к php. Но так как другого раздела я не нашел, а сервер и клиент написаны на php, то задам здесь. ...

Сокет принял данных больше, чем размер буфера
Простой клиент посылает 100 байт. Сервер просто принимает соединение и больше ничего не делает (данные не считывает, уходит в таймаут). У...

Php+mysql что будет если запрос SELECT выполнится быстрее чем UPDATE (в разных потоках)
Ребята. Вот объясните мне пожалуйста. Может ли быть такое?: Предположим, что открылось 2 потока одновременно (2 юзера открыли...

Чем больше размер буфера, тем быстрее программа обрабатывает файл?
Друзья, подскажите, на официальном сайте: =Вот тут docs.embarcadero.com= Первый вопрос: В коде: F, FTwo: System.TextFile; // Почему...


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

Или воспользуйтесь поиском по форуму:
78
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru