|
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 133
|
|
Создание многомерных динамических массивов (динамических многомерных поинтеров)08.05.2024, 21:48. Показов 27400. Ответов 49
Метки нет (Все метки)
Привет знатокам!
Решил написать небольшую функцию по созданию многомерных массивов. Возникло затруднение создать динамические многомерные поинтеры на массивы. Сейчас объясню что хочу. входные/выходные данные: посылаем указатель на структуру в которой первым элементом будет поинтер(одномерный массив) с неизвестным количеством элементов. Количество элементов равно количеству измерений многомерного массива. Второй элемент возвращаемый поинтер на массив. функция читает элементы массива; первый элемент количество измерений массива, последующие элементы количество элементов в каждом измерении. Создать динамический массив не сложно, но возникает сложность когда количество измерений не определено. Возможно ли это средствами С++, я только начал разбираться в С++ , по моему (возможно неумному) мнению не очень удобный язык особенно приведение типов это полный абзац. кучи хендлов и LP по сути являющимися одним и этим же DWORD - кто придумал это г.? После ассемблера это просто отрыв головы(( Спасибо.
0
|
|
| 08.05.2024, 21:48 | |
|
Ответы с готовыми решениями:
49
Указатели динамических массивов Редактор многомерных динамических массивов Составление программ на обработку многомерных динамических массивов |
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
||
| 15.05.2024, 08:35 | ||
|
Так что это очень удобно.
0
|
||
|
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 133
|
|
| 26.05.2024, 22:17 [ТС] | |
|
Дополнительная информация по поводу динамических многомерных массивов, может кому-то будет интересна, я просто сталкиваюсь с этим впервые.
При создании и инициализации многомерных динамических массивов, компилятор создает в памяти цепочку ссылок, как я описывал в одном из моих постов, которая обычно заканчивается DWORD 0xFDFDFDFD. Мелькнула мысль можно ли по желанию в любой момент времени добавлять или удалять еще страницы, листы, главы уже после выполненной инициализации, после того, как вы уже попользовались массивом и вам вдруг не хватило ячеек? или наоборот часть страниц не нужна и вы их удаляете для очистки памяти. Оказалось можно. т.е. если вы создали массив a[1][4][7], а вам нужно его изменить на a[2][5][9] - это можно сделать правда структуру он будет иметь следующую - лист a[0] страница 4х7 лист a[1] страница 4х7 лист a[2] страница 5х9. Хотя листы a[0] и a[1] можно переформировать по своему желанию используя delete []. Смущает следующее - после того как вы формируете новые цепочки указателей, она не заканчивает эти цепочки DWORD 0xFDFDFDFD как обычно, и при попытке удалить вновь созданную страницу, выдает исключение, но в принципе это можно решить искусственно записывая эти байты после последнего поинтера. Компилятор все это пропускает. Вопрос только в следующем команда new определяет пересекающиеся области новых создаваемых страниц?, так как, как я уже писал нет финальной точки после поинтеров. По идее при назначении новых страниц или изменении старых при накладывании значений должно создаваться исключение, т.е. должна быть карта памяти для каждого конкретного массива. Хотя скорее всего для new нет разницы массив это или структура или еще, что-то для нее четко должен быть описан sizeof []. Подпрограмма new должна быть объемная - чтобы все это отслеживать, хотя я не уверен, что она отслеживает - скорее всего выделяет память и забывает, о том что было. В общем надо поэкспериментировать с массивами, чтобы понять контролируется, после того как new отработала пространство памяти или нет? Вот такое интересное, для меня как новичка С++ наблюдение, может кому-то еще тоже будет интересно.
0
|
|
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||||||
| 26.05.2024, 23:37 | ||||||
|
AAAAAlexeyyyyy, средствами стандартной библиотеки C++ можно делать так
Без всяких delete[], хотя ими тоже можно. А ещё, можно тот же принцип что у односвязного списка (когда следующий элемент ищется по указателю в предыдущем) расширить, чтобы указывался динамический массив элементов. Тогда можно делать массивы произвольного ранга и произвольных размерностей. Но работать обращения и перестройки размеров будут оочень медленно. Одномерный массив с адресацией доступа горааздо быстрее.
0
|
||||||
|
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 133
|
||
| 27.05.2024, 22:22 [ТС] | ||
|
0
|
||
|
Вездепух
12933 / 6801 / 1820
Регистрация: 18.10.2014
Сообщений: 17,214
|
|||
| 28.05.2024, 01:19 | |||
new и delete опираются на функции operator new и operator delete, определенные в стандартной библиотеке. Да в любом случае: выделение динамической памяти - явно библиотечная функциональность.
0
|
|||
|
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 133
|
|
| 28.05.2024, 17:04 [ТС] | |
|
0
|
|
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
||
| 28.05.2024, 17:12 | ||
|
0
|
||
|
Вездепух
12933 / 6801 / 1820
Регистрация: 18.10.2014
Сообщений: 17,214
|
|
| 28.05.2024, 17:14 | |
|
0
|
|
|
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 133
|
|||
| 28.05.2024, 21:50 [ТС] | |||
|
Понятное дело, что компилятор это учитель русского языка и литературы.
0
|
|||
|
Вездепух
12933 / 6801 / 1820
Регистрация: 18.10.2014
Сообщений: 17,214
|
||
| 28.05.2024, 22:52 | ||
|
Во-вторых, не существует никакой "библиотеки vector". Класс std::vector входит в стандартную библиотеку С++. Во все ту же стандартную библиотеку С++, которую вы подключаете в любом случае.В-третьих, std::vector - шаблонный класс. Никакого "увеличения объема" чего-либо он не вызывает, сверх того, что вам действительно нужно и что вы действительно используете.
0
|
||
|
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 133
|
||||
| 28.05.2024, 23:27 [ТС] | ||||
|
хотя может быть у Вас по другому( как и во втором случае). Я только начал программировать в c++, и VS, может IDE неправильно настроено, хотя я постарался исключить все лишнее. Здесь шел разговор, что new и delete операторы языка c++, "все остальное" надо подключать.
0
|
||||
|
Вездепух
12933 / 6801 / 1820
Регистрация: 18.10.2014
Сообщений: 17,214
|
||||
| 29.05.2024, 00:07 | ||||
|
Но при чем здесь "инклюды" вообще? Инклюды - это не библиотеки. Вы выше вели речь о подключении некоей "библиотеки". При чем здесь библиотеки вообще? Где вы видели, чтобы #include выполняли "подключение библиотеки"? Где вы слышали про "библиотеку vector"? Нет такой библиотеки.std::cout << "hello world" << std::endl;. Размер экзешника от #include <vector> не меняется вообще никак.
0
|
||||
|
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 133
|
|
| 29.05.2024, 00:56 [ТС] | |
|
TheCalligrapher Есть такое понятие как демагогия. Я признаю, что я просто не могу понять Вас, поэтому наверное не буду больше тратить Ваше и свое время. Как вы написали - Единственный способ не "увеличивать экзешник" - ничего не писать (не делать) - пожалуй воспользуюсь Вашим советом, по крайней мере в этом разговоре - слепого с глухим)), тем более, что никакой значимой информации по интересующей меня теме, Ваши речи к сожалению не несут. Хотя спасибо за попытку осветить эту бездну незнания. плюс, плюс к вашей Карме)).
0
|
|
|
фрилансер
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
|
|
| 29.05.2024, 04:46 | |
|
AAAAAlexeyyyyy, если кратко: не задумывайся про объём экзешника и исходников. Надо - значит надо
0
|
|
|
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 133
|
||
| 29.05.2024, 08:48 [ТС] | ||
|
0
|
||
|
фрилансер
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
|
|
| 29.05.2024, 09:19 | |
|
0
|
|
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
|
| 29.05.2024, 09:56 | |
|
AAAAAlexeyyyyy, а лично мне не понятно почему вы сторонитесь критически важных знаний, которые вам передавал в последних нескольких постах TheCalligrapher. Если вы изучаете C++ и собираетесь потом зарабатывать деньги, то все, что он сказал, необходимо знать и понимать. Так что никакой демагогии в этом нет. Очень странно, что вы с одной стороны говорите, что изучаете язык недавно, а с другой при малейшей попытке поправить ваши знания в лучшую сторону - встаёте в позу уязвлённого самолюбия. Это понятно, когда человек с 10 годами опыта так реагирует, т.к. замечания о том, что он чего-то не знает, влияют на его уже устоявшуюся самооценку - но вам-то что терять? Используйте любую возможность, чтобы учиться. В этой профессии вообще не бывает «неважных знаний».
0
|
|
|
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 133
|
|||||
| 29.05.2024, 10:39 [ТС] | |||||
|
А как вы увидели через компьютер, у меня камеры нет на ноутбуке, что я в определенной позе? Но может быть я не достиг еще просветления и не понимаю путей айтишного мироощущения)), но прочитав вышесказанное думаю, что ну его на фиг)). Может лет через 10 как вы написали на меня сойдет благодать и я хоть чуть-чуть буду соответствовать вашим богоподобным требованиям, пока приходится только соскребать мусор, и фильтровать из этого, хоть что-нибудь, что может принести реальную пользу. А вообще, если без сарказма, то как я писал - я не получил конкретный ответ на конкретный вопрос - а все остальное это только ваши умозаключения основанные на Вашем, мне кажется измененном, мироощущении, но я могу ошибаться. Если можно не плодите, если не по сути вопроса, бессмысленные посты, в попытке показать, что вы кого-то пытаетесь научить, а все вокруг обидчивые дураки. Если есть по сути заданного в топике вопроса пишите, если нет, то я думаю - это интересно только Вам. Я и так потратил на эту мышиную возню много времени. Добавлено через 6 минут
0
|
|||||
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
|||
| 29.05.2024, 11:20 | |||
|
Т.е. порядок действий примерно такой: пишем шаблонный класс, который внутри реализован через линейный массив данных и динамический массив размерностей, с помощью которых размечается линейный массив. Затем при использовании (параметризации шаблона) этого класса можно добавить указатели (сделать на основе этого многомерный массив указателей).
0
|
|||
|
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 133
|
|
| 29.05.2024, 23:04 [ТС] | |
|
DrOffset,
Вопрос как раз и был контролирует ли new пересечение областей выделенной памяти или просто выделила и забыла? я думаю что это так. когда я прописал в ручную в следующую ячейку после вновь созданной страницы массива значение fdfd исключение перестало вылетать и все заработало в штатном режиме, освобождение памяти и тогдалее. Можно попробовать прописать значение fdfd программно, если Вы считаете, что это все в внутреннем debug и посмотреть сработает ли. можно было прогнать через Олечку, но к сожалению нет времени. Кстати что такое UB? Первоначальный вопрос был о динамическом создании многомерных поинтеров, сейчас когда я продебужил в разных вариантах создание массивов, я думаю это можно попробовать сделать, правда можно ли заставить это работать?. Делаем функцию которая принимает n значений - это будет являться мерностью массива, а каждое значение это размер измерения. функция рассчитывает объем памяти Пn(1..n)*sizeof(type) + память на поинтеры. раскидываем таблицы поинтеров для каждого измерения и в принципе все. Остается пустяк заставить все это работать)) потому что при попытке подсунуть учителю русского языка выражение [1]...[5] она скажет, что-то типа - не определен такой размерности. Внутри компилятора должна быть - функция массив которая принимает начальный поинтер и определенное количество индексов и выдает адрес или значение. Это должна быть одна функция независимо от размерности массива, что-то типа адрес нулевого поинтера и список индексов (может даже рекурентная, надо больше читать Кнута). Мы не сможем уже подсунуть дополнительные индексы, в попытке использовать эту функцию с искусственно созданным массивом, так как для этого в машинном коде уже нет места. Одни ограничения. Как вы писали "Эта фича .... помогает лучше контролировать программу" Последний абзац это интересно В отношении линейного массива, я считаю это хорошая вещь - я это писал. в ассемблере нет многомерных массивов есть линейная память - все остальное это рукоблудие программиста. 1) Неплохо было посмотреть реализацию этого! 2) стандартный компилятор будет правильно трактовать эти индексы? и работать с ним как с обычным массивом или мы просто пишем свою новую функцию под названием массив (или как там в с++ переопределяем функцию) - в которую скидываем индексы адрес таблицы поинтеров и она выдает адреса или значение с этого адреса в зависимости, что мы хотим?.
0
|
|
| 29.05.2024, 23:04 | |
|
Помогаю со студенческими работами здесь
40
Создание динамических массивов Создание динамических двумерных массивов Создание и размер динамических массивов Индексация многомерных массивов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
|
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|