|
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
|
||||||||||||||||
Массив переменной длины, инициализирующийся при компиляции10.06.2022, 17:48. Показов 4010. Ответов 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
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 11.06.2022, 01:13 | ||
|
В частности часть кода стандартной библиотека именно так и написана. Чтобы не загромождать огромными функциями объвления классов.
1
|
||
|
Гвоздь Задиров
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
|
||
| 11.06.2022, 01:30 | ||
|
С разделением реализаций-то я угадал хоть? Интересовал просто именно практический смысл.
0
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||
| 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
|
||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||||||||||
| 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 переменной
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации:
1. Вернуть возможность использования знаков | 1 l I;. . .
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки.
Добавлены следующие реквизиты типа Булево:
- Буквы;
- Цифры;
- Символы.
Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
|
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей.
Самым главным критерием для. . .
|
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store.
И так:
1. Скачиваем с. . .
|