|
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
|
||||||||||||||||
Массив переменной длины, инициализирующийся при компиляции10.06.2022, 17:48. Показов 3829. Ответов 63
Метки нет (Все метки)
Приветствую всех. Вопрос, наверное, элементарный. Но я банально не знаю, что вбить в Яндекс. В коллекции решенных задач такого не нашел. Если такая тема уже была, бросьте ссылку, плиз.
Допустим, есть класс. Внутри класса должен быть массив.
С++ только начал изучать, до этого много работал на C. Там такое невозможно, только так:
Надеюсь, в C++ есть более элегантное решение?
0
|
||||||||||||||||
| 10.06.2022, 17:48 | |
|
Ответы с готовыми решениями:
63
Массив переменной длины массив переменной длины Передать в C# массив переменной длины. |
|
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
|
||
| 11.06.2022, 01:09 | ||
|
Все-таки C/C++ гарантирует что элементы массива будут в памяти по порядку. И потом, разве эмбедники/эмбедчики (не знаю, как верно) не делают постоянно крутые хаки, чтобы марсоходы и спутники могли вытворять вещи, первоначально не задуманные? Может, я слишком фантазирую про область, с которой сам не сталкивался. Добавлено через 2 минуты Еще есть вариант с placement new, где сам задаешь куда положить объект. Все конструкторы/деструкторы будут работать.
0
|
||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||
| 11.06.2022, 01:13 | ||
|
В частности часть кода стандартной библиотека именно так и написана. Чтобы не загромождать огромными функциями объвления классов.
1
|
||
|
Гвоздь Задиров
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
|
||
| 11.06.2022, 01:30 | ||
|
С разделением реализаций-то я угадал хоть? Интересовал просто именно практический смысл.
0
|
||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|||
| 11.06.2022, 01:43 | |||
|
1
|
|||
|
Гвоздь Задиров
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
|
||
| 11.06.2022, 02:08 | ||
|
Уточнял лишь на предмет возможных фишек, о которых не догадывался.
0
|
||
|
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
|
||||||||||||||||||||||||||
| 14.09.2022, 14:49 [ТС] | ||||||||||||||||||||||||||
|
Всем добрый день, опять нужен совет.
Опять наступил на грабли. Создал кастомный буфер.
0
|
||||||||||||||||||||||||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|||||||||||||
| 14.09.2022, 16:16 | |||||||||||||
|
Но код для эмбедед обычно более утилитарен, нам нет "непонятно какого размера приехавшего json". Например, массив - это может быть просто состояние кнопок панели управления. В модели изделия ABC100 кнопок на панели 10, а в аналогичной модели ABC100 Lux этих кнопок 15 (функций больше). Т.е. "динамичность" размера массива нам как бы нужна, но при сборке прошивки под ту или другую модель мы точно знаем размер этого массива ужа не этапе компиляции. Добавлено через 41 минуту Я бы в случае такой необходимости внутрь Func1() передавал не объект, а указатель на его внутренний буфер и сохраненный в объекте размер. Примерно что-то такое:
Не, во как надо сделать, вообще красиво!
Красота!
0
|
|||||||||||||
|
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
|
|
| 14.09.2022, 18:27 [ТС] | |
|
KSergey9, функции и не нужно знать объем rawData. Она вызывает функции read, write и т.п. Выводить rawData в public - это грубейшее нарушение инкапсуляции на мой взгляд. Если уж нужно, буфер может выполнять return sizeof(rawData) в каком то методе. Сам объект же памяти не лишается от указателя :-)
Добавлено через 5 минут KSergey9, во втором варианте вы просто передвинули проблему на уровень выше. На функцию тоже может быть указатель. Не переделывать же весь вышестоящий код под шаблоны? Плюс получится несколько экземпляра этой функции, расход памяти.
0
|
|
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||||||
| 14.09.2022, 19:16 | ||||||
|
Как вы сделаете в вашем коде - дело ваше. Вы спросили: как синтаксически написать функцию, куда можно было бы аргументом передать Buff разного размера. Я вам привел пример как это можно сделать. Чем вы недовольны? Вы захотели использовать другие языковые средства - пожалуйста. Как их использовать - вам показали в этой ветке. Использовать или нет - дело ваше. Нужна одна реализация функции - используйте подход 1, либо сделайте Func1() просто методом класса-шаблона, тогда проблема с передачей в неё разных вариаций Buff вовсе отпадёт. Добавлено через 3 минуты Если честно, моё мнение: делайте код на старых добрых макросах. Ибо, моё мнение, все эти "шаблоны" - лапша на уши народу. А на самом деле абсолютно те же самые макросы, только в "стильном-молодёжном" синтаксисе. Но это Тс-сс. Я такого не говорил, если что.
0
|
||||||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|||||||||||
| 14.09.2022, 19:44 | |||||||||||
|
Zhavoronkov5, ниже несколько вариантов, если вы так или иначе хотите, чтобы код на каком-то уровне оставался шаблонным.
Вариант #1
0
|
|||||||||||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|
| 14.09.2022, 20:23 | |
|
DrOffset, мне подсказывает чутье, что у автора
func предполагается как некий внешний алгоритм для работы с Buff (через его же интерфейс/методы).Поэтому мне кажется шаблонная реализация функции func, самым простым вариантом.Еще один вариант, создать базовый интерфейс для Buff, достаточный для написания внешних алгоритмов. Все прочие буферы будут наследоваться и поддерживать этот интерфейс. В итоге такие алгоритмы как func, будут в одном экземпляре и принимать только указатель/ссылку на интерфейс. Как в ваших вариантах, только без раздачи указателей. Ну и кончено же назначение этой самой функции (func), определяет насколько необходимо изменять реализацию и конструкцию Buff. А может все же лучше сделать ее методом того же буфера ... Пока ёжик бродит в тумане, остается только гадать...
0
|
|
|
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
|
|||||||||||
| 14.09.2022, 22:51 [ТС] | |||||||||||
|
Боюсь, ёжику от этого не полегчало :-) Впрочем, спасибо за фразу:
Добавлено через 9 минут Возможность поставить брекпойнт внутри - да ради одного этого на С++ и шаблоны надо переходить.
0
|
|||||||||||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|||
| 14.09.2022, 23:13 | |||
constexpr, и множество вычислений повесить на этап компиляции.Там где это возможно. Тогда и final на Buff стоит установить.
0
|
|||
|
What a waste!
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
|
||
| 14.09.2022, 23:23 | ||
virtual, так что можно переопределять в любом наследнике
0
|
||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|
| 14.09.2022, 23:27 | |
|
gray_fox, да, запутался, с этой виртуальностью нужно быть внимательным.
Но все же для большей читабельности и определенности, а также предупреждения ошибок : стоит повторить (указать) virtual и override.
0
|
|
|
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
|
||||||
| 14.09.2022, 23:53 [ТС] | ||||||
|
Повторное наследование работает, но коряво.
0
|
||||||
|
Комп_Оратор)
|
||
| 15.09.2022, 00:08 | ||
|
0
|
||
|
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
|
|||
| 15.09.2022, 00:23 [ТС] | |||
|
Небольшую осторожность соблюдать надо, да. Вот, хотел написать на шаблонах, выше даже получилось совместными усилиями. Только громоздко все-таки. Я ожидал, что будет попроще. На самом деле если я сейчас забью и встрою в этот класс std::vector - мир не рухнет, код заработает. А если я не буду vector в процессе ресайзить - все проработает сто лет без сбоев. Память в куче один раз выделится при инициализации системы и все.
0
|
|||
|
Комп_Оратор)
|
|||
| 15.09.2022, 00:46 | |||
|
0
|
|||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|
| 15.09.2022, 08:35 | |
|
0
|
|
| 15.09.2022, 08:35 | |
|
Нужен массив переменной длины с возможностью добавления элементов Ошибка компиляции при работе с float переменной
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|