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

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

27.05.2020, 05:47. Показов 8426. Ответов 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
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
12.05.2021, 11:31
Цитата Сообщение от alexbmd Посмотреть сообщение
как же а const ..
сори я запутался и вас запутал, я просто больше С++11 а вы в ногу со временем... итого еще раз если inline static то можно внутри но только начиная с версии 17. если const static то можно внутри в любой версии. в остальных случаях только вне класса надо определять. спасибо. осталось только не забыть и не запутаться.
Варианты без inline не являются определениями. static const внутри класса - это объявление, но не определение. По-моему я уже об этом говорил.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
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 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,538
Записей в блоге: 1
13.05.2021, 11:04
TheCalligrapher, ты забыл объявить под определением структуры int S::a, S::b;
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
13.05.2021, 11:22
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ты забыл объявить под определением структуры int S::a, S::b;
Я ничего не забыл. Я же подробно все описал в своем ответе.

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

Что касается S::b - в ответе все ясно написано.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
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
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
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
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
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
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru