Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456

Вариативный размер массива в разных экземплярах класса

03.03.2026, 06:59. Показов 4458. Ответов 74
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста как задать размер статического массива в каждом экземпляре класса?
C++
1
2
3
4
5
class uart
{
 static const BUF_SIZE = 128;     
 uint8_t buf[BUF_SIZE];    
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.03.2026, 06:59
Ответы с готовыми решениями:

Разное значение переменной класса, в разных экземплярах класса
Вот примерный код: class Test { private: static int countC; static int countD;...

О экземплярах класса
Приветствую. Есть класс Websocket .h/.cpp В websocket.cpp #include "websocket.h" ...

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

74
фрилансер
 Аватар для Алексей1153
6465 / 5679 / 1131
Регистрация: 11.10.2019
Сообщений: 15,122
03.03.2026, 08:27
Лучший ответ Сообщение было отмечено zss как решение

Решение

Korbofos, только это не статический массив, а массив-поле класса

Можно шаблончик применить
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <cstddef>
#include <cstdint>
 
template<size_t BUF_SIZE>
class uart
{
    uint8_t buf[BUF_SIZE];    
};
 
int main()
{
    uart<128> u1;
    uart<256> u2;
}
3
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13179 / 6815 / 1821
Регистрация: 18.10.2014
Сообщений: 17,243
03.03.2026, 08:55
Цитата Сообщение от Korbofos Посмотреть сообщение
Подскажите пожалуйста как задать размер статического массива в каждом экземпляре класса?
C++
1
2
3
4
5
class uart
{
 static const BUF_SIZE = 128;     
 uint8_t buf[BUF_SIZE];    
}
Во-первых, не забывать указывать типы в объявлениях

C++
1
2
3
4
5
class uart
{
  static const unsigned BUF_SIZE = 128;     
  uint8_t buf[BUF_SIZE];    
};
Во-вторых, я вижу, что размер массива является статическим членом. Сам же массив - никакой не статический. О каком "статическом массиве" тогда идет речь вообще?

Во-третьих, что значит "в каждом экземпляре класса"?
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
03.03.2026, 09:10  [ТС]
А как теперь работать с этим массивом методу этого класса? А то выдаёт ошибку
0
Злостный нарушитель
 Аватар для Verevkin
10359 / 5779 / 1275
Регистрация: 12.03.2015
Сообщений: 26,705
03.03.2026, 09:22
Цитата Сообщение от Korbofos Посмотреть сообщение
А то выдаёт ошибку
Секретную?
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
03.03.2026, 09:25  [ТС]
error: ‘template<short unsigned int BUF_SIZE> class usart’ used without template arguments
0
Злостный нарушитель
 Аватар для Verevkin
10359 / 5779 / 1275
Регистрация: 12.03.2015
Сообщений: 26,705
03.03.2026, 09:39
Цитата Сообщение от Korbofos Посмотреть сообщение
error: ‘template<short unsigned int BUF_SIZE> class usart’ used without template arguments
У меня вот так работает:
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
#include <iostream>
//#include <cstddef>
#include <cstdint>
 
#define MIN2(a, b) (((a) < (b)) ? (a) : (b))
 
template<size_t BUF_SIZE>
class uart
{
  private:
    uint8_t buf[BUF_SIZE];    
  public:
    void fill_ordered(void)
    {
      for (auto idx = 0; idx != BUF_SIZE; idx++) 
        buf[idx] = idx & 0xFF;
    }
    
    void fill_rand(uint8_t max = 255)
    {
      for (auto &x : buf) 
        x = rand() % max;
    }
    
    void print(size_t from_idx = 0, size_t count = 0)
    {
      auto lim = count ? MIN2(from_idx + count, BUF_SIZE) : BUF_SIZE - from_idx;
      for (auto idx = from_idx; idx < lim; idx++)
        printf("%u ", buf[idx]);
      printf("\n");  
    }
};
 
int main()
{
  uart<64> u1;
  uart<128> u2;
  
  u1.fill_rand();
  u1.print();
  
  u2.fill_ordered();
  u2.print();
    
  return 0;  
}
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
03.03.2026, 11:25  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <const uint16_t BUF_SIZE>
class usart
{                                                         
   uint8_t buf[BUF_SIZE];
 public:
   void init();
  
};
 
void usart::init()
{
 uint16_t a = buf[0]; 
}
 
int main() {
    // your code goes here
 usart<10> u;
 u.init();
}
Code
1
2
3
4
5
6
sol.cpp:13:6: error: ‘template<short unsigned int BUF_SIZE> class usart’ used without template arguments
   13 | void usart::init(){uint16_t a = buf[0]; }
      |      ^~~~~
sol.cpp: In function ‘void init()’:
sol.cpp:13:33: error: ‘buf’ was not declared in this scope
   13 | void usart::init(){uint16_t a = buf[0]; }
0
фрилансер
 Аватар для Алексей1153
6465 / 5679 / 1131
Регистрация: 11.10.2019
Сообщений: 15,122
03.03.2026, 11:29
Korbofos,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <cstddef>
#include <cstdint>
 
template <uint16_t BUF_SIZE>
class usart
{                                                         
    uint8_t buf[BUF_SIZE];
public:
    void init();
};
 
template <uint16_t BUF_SIZE>
void usart<BUF_SIZE>::init()
{
    uint16_t a = buf[0]; 
}
 
int main()
{
    usart<10> u;
    u.init();
}
только зачем наружу метод вытаскивать ? Пусть внутри сидит
1
Злостный нарушитель
 Аватар для Verevkin
10359 / 5779 / 1275
Регистрация: 12.03.2015
Сообщений: 26,705
03.03.2026, 11:38
Цитата Сообщение от Алексей1153 Посмотреть сообщение
только зачем наружу метод вытаскивать ? Пусть внутри сидит
Ну, наверное, штоп можно было описалово класса пихнуть в h-файл, а реализацию - в 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
#include <iostream>
#include <cstdint>
 
#define TEMPLATE_USART template <const uint16_t BUF_SIZE>
 
TEMPLATE_USART class usart
{                                                         
   uint8_t buf[BUF_SIZE];
 public:
   void init();
};
 
TEMPLATE_USART void usart<BUF_SIZE>::init()
{
 uint16_t a = buf[0]; 
}
 
int main() 
{
    // your code goes here
 usart<10> u;
 u.init();
}
Но уже всё это мне не нравится, т.к. начинает быть похожим на говнокод.
1
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
03.03.2026, 11:58  [ТС]
Да не очень получается, отдельно под каждый уарт свой класс. В принципе как сейчас и есть реализация. Динамическую память не хочется использовать в мк
0
Модератор
Эксперт Java
 Аватар для alecss131
2880 / 1384 / 411
Регистрация: 11.08.2017
Сообщений: 4,413
Записей в блоге: 2
03.03.2026, 12:05
Цитата Сообщение от Verevkin Посмотреть сообщение
описалово класса пихнуть в h-файл, а реализацию - в cpp
Только вот с шаблонными классами свои особенности с подобным делением, далеко не все можно выкинуть в реализацию.
0
Злостный нарушитель
 Аватар для Verevkin
10359 / 5779 / 1275
Регистрация: 12.03.2015
Сообщений: 26,705
03.03.2026, 12:08
Цитата Сообщение от alecss131 Посмотреть сообщение
Только вот с шаблонными классами свои особенности с подобным делением, далеко не все можно выкинуть в реализацию.
Тебе видней. Я в С++ не копенгаген. Пишу сам знаешь на чём. Там с этим проще.
Цитата Сообщение от Korbofos Посмотреть сообщение
Динамическую память не хочется использовать в мк
Тогда мож и С++ лучше в МК не юзать, а довольствоваться чистым С? Особенно, если ты не собираешься использовать в одной прошивке несколько разных экземпляров этого класса.
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
03.03.2026, 12:16  [ТС]
Часто приходиться использовать несколько уартов
0
Злостный нарушитель
 Аватар для Verevkin
10359 / 5779 / 1275
Регистрация: 12.03.2015
Сообщений: 26,705
03.03.2026, 12:26
Цитата Сообщение от Korbofos Посмотреть сообщение
Часто приходиться использовать несколько уартов
тся.
0
 Аватар для Наталья8
620 / 378 / 67
Регистрация: 09.03.2016
Сообщений: 4,068
03.03.2026, 13:56
Нагородили... Буду вникать...

Добавлено через 37 минут
Есть ли случаи, когда C лучше C++? [закрыт]
https://ru.нехорошееслово.com/... 88%D0%B5-c
0
 Аватар для Наталья8
620 / 378 / 67
Регистрация: 09.03.2016
Сообщений: 4,068
03.03.2026, 13:58
Мнения некоторых людей.
Я люблю собирать разные фичи, только нестандартные.
Подходят лучше. Как свои становятся.
0
11 / 10 / 1
Регистрация: 16.12.2025
Сообщений: 110
03.03.2026, 16:41
Цитата Сообщение от Korbofos Посмотреть сообщение
Подскажите пожалуйста как задать размер статического массива в каждом экземпляре класса?
Нет.

Но можно использовать указатель на данные на стеке, и получать размещение, например, из линейного аллокатора.
Выбор аллокатора зависит от использования таких классов.

То что выше предложили - это не один класс. Со всеми вытекающими.
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
#include <iostream>
class Allocator{
   static inline constexpr unsigned SIZE = 65536;
   char buf[SIZE];
   unsigned pos = 0;
public:
   char* get(unsigned size){
      if (size && size <= (SIZE - pos))
         return &buf[(pos+=size)-size];
      throw std::runtime_error("Allocate automatic buffer error");
   }
};
 
struct Class{
   Class(char* buf, unsigned size)
      : buf{buf}, size{size}{
      
   }
   char* buf;
   unsigned size;
};
 
int main(){
   Allocator a;
   Class c1(a.get(128), 128);
   Class c2(a.get(256), 256);
}
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
03.03.2026, 17:54  [ТС]
А если использовать список инициализации? Только ошибку выдаёт
C++
1
usart(uint16_t size) : BUF_SIZE(size) {}
Добавлено через 2 минуты
Не, не получиться
0
Злостный нарушитель
 Аватар для Verevkin
10359 / 5779 / 1275
Регистрация: 12.03.2015
Сообщений: 26,705
03.03.2026, 17:58
Цитата Сообщение от Korbofos Посмотреть сообщение
Не, не получиться
тся
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.03.2026, 17:58
Помогаю со студенческими работами здесь

Найти элементы, присутствующие в нескольких экземплярах либо только в массиве А, либо только в массиве B
Нужно найти элементы, присутствующие в нескольких экземплярах либо только в массиве А, либо только...

Вывести элементы, которые есть в массиве А в нескольких экземплярах и отсутствуют в массиве В
Задание : вывести на экран элементы, которые есть в массиве А в нескольких экземплярах и...

2-мерные массивы: Вызов конструктора портит данные в других экземплярах
Проблема: обнаружилось, что порой пропадают числа из существующих экземпляров класса. Числа...

Элементы, которые есть в нескольких экземплярах в Массиве А и отсутствуют в Массиве В
Задание : вывести на экран элементы, которые есть в массиве А в нескольких экземплярах и...

Найти элементы, которые есть в массиве А в нескольких экземплярах и отсутствуют в массиве В
Задание : вывести на экран элементы, которые есть в массиве А в нескольких экземплярах и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru