|
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 133
|
|
Создание многомерных динамических массивов (динамических многомерных поинтеров)08.05.2024, 21:48. Показов 27789. Ответов 49
Метки нет (Все метки)
Привет знатокам!
Решил написать небольшую функцию по созданию многомерных массивов. Возникло затруднение создать динамические многомерные поинтеры на массивы. Сейчас объясню что хочу. входные/выходные данные: посылаем указатель на структуру в которой первым элементом будет поинтер(одномерный массив) с неизвестным количеством элементов. Количество элементов равно количеству измерений многомерного массива. Второй элемент возвращаемый поинтер на массив. функция читает элементы массива; первый элемент количество измерений массива, последующие элементы количество элементов в каждом измерении. Создать динамический массив не сложно, но возникает сложность когда количество измерений не определено. Возможно ли это средствами С++, я только начал разбираться в С++ , по моему (возможно неумному) мнению не очень удобный язык особенно приведение типов это полный абзац. кучи хендлов и LP по сути являющимися одним и этим же DWORD - кто придумал это г.? После ассемблера это просто отрыв головы(( Спасибо.
0
|
|
| 08.05.2024, 21:48 | |
|
Ответы с готовыми решениями:
49
Указатели динамических массивов Редактор многомерных динамических массивов Составление программ на обработку многомерных динамических массивов |
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
|
||
| 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
|
||
|
Вездепух
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
|
|||
| 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
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
|
||
| 28.05.2024, 17:12 | ||
|
0
|
||
|
Вездепух
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
|
|
| 28.05.2024, 17:14 | |
|
0
|
|
|
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 133
|
|||
| 28.05.2024, 21:50 [ТС] | |||
|
Понятное дело, что компилятор это учитель русского языка и литературы.
0
|
|||
|
Вездепух
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
|
||
| 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
|
||||
|
Вездепух
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
|
||||
| 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
|
|
|
фрилансер
6484 / 5710 / 1132
Регистрация: 11.10.2019
Сообщений: 15,222
|
|
| 29.05.2024, 04:46 | |
|
AAAAAlexeyyyyy, если кратко: не задумывайся про объём экзешника и исходников. Надо - значит надо
0
|
|
|
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 133
|
||
| 29.05.2024, 08:48 [ТС] | ||
|
0
|
||
|
фрилансер
6484 / 5710 / 1132
Регистрация: 11.10.2019
Сообщений: 15,222
|
|
| 29.05.2024, 09:19 | |
|
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
|
|
| 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
|
|||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
|
|||
| 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
Создание динамических массивов Создание динамических двумерных массивов Создание и размер динамических массивов Индексация многомерных массивов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Гайд, как ворваться в вайб-кодинг в мае 2026
Noname2331 17.05.2026
Простите за получившееся полотно текста, я даже не знаю, как его разбить на главы. Тут, что называется, ни добавить ни убавить, одна сцена одним дублем.
На моих глазах недавно случилось чудо. Как. . .
|
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера»
Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит.
Придуман Биллом Госпером в 1970-х, опубликован в. . .
|
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb">
<style>
<!]>
</ style>
<g id="bush">
</ g>
</ svg>
function fn(){
let rost;/ / высота древа
let xx=165,yy=210,w=256;
|
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов,
содержащихся в реализации модуля. По-умолчанию все члены модуля доступны:
module Foo
let x = 10
let boo () = printfn "boo"
. . .
|
|
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible". . .
|
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов.
import "math"
func angleClock(hour int, minutes int) float64 {
. . .
|
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo
https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html
и его же старой инструкции по установке Lazarus с gtk2. . .
|
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер.
Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
|