С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/75: Рейтинг темы: голосов - 75, средняя оценка - 4.93
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 133

Создание многомерных динамических массивов (динамических многомерных поинтеров)

08.05.2024, 21:48. Показов 27350. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет знатокам!
Решил написать небольшую функцию по созданию многомерных массивов. Возникло затруднение создать динамические многомерные поинтеры на массивы. Сейчас объясню что хочу.
входные/выходные данные: посылаем указатель на структуру в которой первым элементом будет поинтер(одномерный массив) с неизвестным количеством элементов. Количество элементов равно количеству измерений многомерного массива. Второй элемент возвращаемый поинтер на массив.
функция читает элементы массива; первый элемент количество измерений массива, последующие элементы количество элементов в каждом измерении.
Создать динамический массив не сложно, но возникает сложность когда количество измерений не определено.
Возможно ли это средствами С++, я только начал разбираться в С++ , по моему (возможно неумному) мнению не очень удобный язык особенно приведение типов это полный абзац. кучи хендлов и LP по сути являющимися одним и этим же DWORD - кто придумал это г.? После ассемблера это просто отрыв головы((
Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.05.2024, 21:48
Ответы с готовыми решениями:

Указатели динамических массивов
Проблема такого характера: Мне нужно передать в функцию столбец матрицы(динамического двухмерного массива) без создание дополнительных...

Редактор многомерных динамических массивов
!!! Пишу в Microsoft Visual Studio ->Win32 Console application ->C++. !!! Помогите мне пожалуйста...

Составление программ на обработку многомерных динамических массивов
Для каждой строки двумерного массива выяснить количество элементов, последняя цифра которых равна а.

49
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
29.05.2024, 23:27
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
Кстати что такое UB?
UB - Undefined Behaviour - Неопределенное поведение. В вики есть статья с примерами.

Язык C++ - это не Java, у него нет виртуальной машины, которая может контролировать доступ, например, к памяти. Корректный доступ к памяти оставлен на совести программиста чтобы не замедлять программу тотальным контролем за памятью со стороны среды исполнения и все операции вне разрешенной памяти объявлены неопределенными. Они могут работать, могут не работать, могут работать сейчас, но сломаться потом. Могут запустить форматирование вашего жесткого диска, или запустить игру тетрис вместо того, что вы ждете. Это неизвестно. Память, где лежит FDFD - не ваша, это память менеджера кучи. Вы не имеете права писать туда что-то, даже если это работает. Вам может показаться, что если у вас получилось поставить успешный эксперимент, то это означает, что все было корректно, но нет - в C++ это так не работает. Фактически вы просто должны знать язык лучше, чем может вам объяснить компилятор, чтобы успешно писать на нем. Поэтому он считается сложным в большинстве сообществ.

Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
компилятор будет правильно трактовать эти индексы? и работать с ним как с обычным массивом или мы просто
Мы можем повторить вручную тот же способ пересчета индексов, что применяется компилятором при доступе к элементам встроенных многоамерных массивов. Это несложно. Алексей в 6 посте показал как. Нужно понимать, что встроенные массивы тоже линейны по своей памяти.

Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
Неплохо было посмотреть реализацию этого!
Правильная реализация с нуля (с минимумом библиотечных средств как вы и хотели) с учетом всех нюансов - это большая работа. Можно собрать макет на базе вектора, это будет проще и короче по коду.
0
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 133
29.05.2024, 23:50  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Вы не имеете права писать туда
ну как я и предполагал, new - грубо говоря, выделила память, а дальше ей все равно, как и показывает эксперимент с fdfd...
эксперимент как раз и позволил, как вы написали глубже знать язык - я писал в том посте - интересное наблюдение...
Давайте начистоту вы знали про эту особенность? хорошо не Вы, а все те, кто прочитал этот пост знали про эту особенность?
Так что данное сообщение можно считать как deep learning))
А если говорить как вы писали... чтобы лучше контролировать программу, то мне кажется использование этого языка - мнимое удобство. Я должен еще и знать исходники всех операторов, что они там чудят(( даже при использовании стандартной лексики языка - которую пропускает компилятор.
А еще существуют библиотеки в общем - мдя...
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
30.05.2024, 00:19
Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
Давайте начистоту вы знали про эту особенность?
Почему такой результат работы функции?
У меня есть пруфы. Прочтите. Тема 2019 года. Естественно я знаю про все особенности, которые вам могут только прийти в голову и которые не могут.

Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
то мне кажется использование этого языка - мнимое удобство.
Вы сейчас пишете этот текст из браузера, который написан на C++ с еще большими ограничениями, чем накладывает сам язык. И все это сделано для того, чтобы контролировать сложность огромного проекта (современный браузер - это огромный проект). Так что нет, удобство не мнимое, а вполне реальное. Вам просто не хватает опыта его оценить.

Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
Я должен еще и знать исходники всех операторов, что они там чудят
Нет, но вы должны знать их контракты. Внутренности знать не нужно (точнее это может быть даже вредно, как показывает данная тема. Можно, например, решить, что fdfd каким-то образом относится к языку C++ и будет работать везде, однако это не так - язык ничего такого не требует от реализаций).

Добавлено через 8 минут
Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
грубо говоря, выделила память, а дальше ей все равно
Это зависит от реализации. Реализаций много, внутри они могут быть организованы совершенно по-разному. Единственное что требует язык - следовать установленному контракту, все, что сверх этого - как угодно.

Контракты для new и delete описаны здесь:
https://eel.is/c++draft/new.delete
По-хорошему ваша программа не должна выходить за их предел при работе с new\delete. Если нужно что-то другое, то имеет смысл заменить глобальный аллокатор на какой-то свой собственный.
0
фрилансер
 Аватар для Алексей1153
6445 / 5640 / 1128
Регистрация: 11.10.2019
Сообщений: 15,007
30.05.2024, 06:10
Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
Вопрос как раз и был контролирует ли new пересечение областей выделенной памяти
в том смысле, что два new[] не пересекутся (если между ними не было delete[] ) - да, контролирует
0
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 133
30.05.2024, 16:35  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Естественно я знаю про все особенности, которые вам могут только прийти в голову и которые не могут.
ну что-то я не очень доверяю Вашим словам Уважаемый доктор!
В посте #39 вы пишите одно
Цитата Сообщение от DrOffset Посмотреть сообщение
И пытаться переназначать области, используя зависимую от компилятора отладочную информацию (те самые FDFD, - они существуют только в debug режиме в компиляторе MSVC)
В посте #41 у Вас уже другое
Цитата Сообщение от DrOffset Посмотреть сообщение
Память, где лежит FDFD - не ваша, это память менеджера кучи.
Не поленился проверил загрузил через отладчик проект, который я делаю
определил с помощью new двумерный массив и оказалось, что fdfd все-таки существует, не только в моем больном воображении и воображении больного компилятора)). Чтобы полностью исключить возражения по быстрому написал функцию которая распечатывает содержимое следующей после поинтеров на данный массив ячейки памяти. Запустил без отладчика, как ни странно мой компьютер оказался тоже не совсем здоров и выдал fdfd(((
У вас классный ник DrOffset Может дорогой доктор полечит меня мой компьютер и компилятор)) очередной порцией интересных историй про его high level, что надо глубже учить язык, только бы его не проглотить))
Цитата Сообщение от DrOffset Посмотреть сообщение
Так что нет, удобство не мнимое, а вполне реальное. Вам просто не хватает опыта его оценить.
А мне кажется все таки язык кривой, я это уже подтвердил - я могу заносить в запрещенные области информацию, при помощи оператора new формируя новые страницы, что приводит к исключениям и ни кто это не контролирует(((.
Для достижения стабильности мне чуть ли исходники операторов тогда надо изучать((, как вы там написали Контрактов - не достаточно.((
Цитата Сообщение от DrOffset Посмотреть сообщение
Вы сейчас пишете этот текст из браузера, который написан на C++
Вау как круто, я просто под столом)) неужели?, а Вы кому-нибудь это рассказывали?
Вообще Windows,Linux,Unix.... написаны на С. И от этого кривой инструмент не становится прямее, просто нет ничего более подходящего(( И одним из подтверждений его кривизны являются бесконечные баги, которые надо править. Можно конечно сказать, что там туча людей работает, за всеми не уследишь итд - и это правда, а где же ваша любимая типизация которая как вы писали позволяет лучше контролировать код. Что-то мне кажется все таки общаясь на этом форуме можно легко подцепить эту серьезную хворь - демагогию. Похоже я не ошибался, что видоизмененное мироощущение все-таки здесь присутствует.


Выражаясь Вашим языком - пруффы в студию. screenshot отладчика где я проверял ваши глубокие знания. подчеркнуты 2 dword для поинтеров строк еще не заполненные (обычно эти поля перед заполнением содержат cdcdcdcd), и третий dword fdfdfdfd после выполнения оператора new; красным - точка останова с вызовом оператора new; iep - текущая выполняемая команда; ss:[ebp-e0] адрес нулевого поинтера который равен 0x016675A8.

Прекратите писать ерунду, эту ветку форума просмотрели более 1800 раз, зачем дескридитировать себя, все это читают и видят. Надо быть нормальными людьми. Знаете - пишите ответ, не знаю - пишите не знаю - это Все оценят и это только добавит к Вам уважения.
Врать надо девушкам, если они конечно будут Вас слушать))

А теперь можете заплевать меня своими обычными фразами про обидчивого неуча))
Миниатюры
Создание многомерных динамических массивов (динамических многомерных поинтеров)  
0
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 133
30.05.2024, 16:57  [ТС]
Алексей1153,
пересекутся, я это и проверил,я об этом писал был создан трехмерный массив. Потом некоторое время я работал с данными этого массива. В том числе создавал другие массивы. Потом меня осенила идея проверить можно ли это? - и уже к существующему первому массиву решил добавить страниц, листов и глав - после этого new начала затирать точки которые она сама расставляет fdfdfdfd. и при попытке удаления массива, страницы или листа выдавала исключение, когда я прописывал fdfdfdfd на то место где оно должно было быть - исключение пропало.
Следующий эксперимент был - записал в этот видоизмененый массив с новой страницей(поинтером) - fdfdfdfd на следующее место после нового поинтера как писал drOffset в запрещенную память. И это исключение опять пропало. я думаю эти fdfdfdfd нужны для delete в качестве рэперных точек. кстати при удалении она записывает туда опять cdcdcdcd
Мы уже с вами обсуждали что new создает динамические страницы с большими дырками между страницами и в этом плане линейные массивы лучше. Я не исключаю, что в этих областях хранится какая-то служебная информация может по размеру страниц, количеству страниц,( поэтому дырки между страницами), и писать туда вроде как нельзя. Но факт остается фактом.((
Я посмотрел эти области не заполнены случайными байтами - правда не дизассемблировал - не было желания, может там вообще какие либо фрагменты кода.
0
фрилансер
 Аватар для Алексей1153
6445 / 5640 / 1128
Регистрация: 11.10.2019
Сообщений: 15,007
30.05.2024, 17:25
Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
Вообще Windows,Linux,Unix.... написаны на С.
просто когда они создавались, была возможность делать их только на C. А сейчас уже легаси не исправишь

Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
А мне кажется все таки язык кривой
это не язык, а руки

Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
пересекутся
нет

-------------
И вообще, сделай лицо попроще. Поначалу ты выглядел адекватным, а щас понесло тебя, аж неприятно
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
30.05.2024, 18:59
Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
В посте #41 у Вас уже другое
В смысле другое? Это все то же. Менеджер кучи C++ находится в его стандартной библиотеке, а стандартная библиотека поставляется с компилятором. Здесь нет никакого противоречия.

Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
а где же ваша любимая типизация которая как вы писали позволяет лучше контролировать код.
Ну никто не обещал, что одним единственным инструментом удастся решить все проблемы. Как вы сказали правильно - лучше все равно ничего нет.

Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
определил с помощью new двумерный массив и оказалось, что fdfd все-таки существует
И что? Не понятно с чем вы спорите. Никто не писал, что не существует. Я писал, что FDFD существует в реализации стандартной библиотеки от MS в отладочном режиме. А вы как использовали debugging heap, так и продолжаете использовать, запустились вы под отладчиком или без него - не важно. Именно поэтому у вас прилетают исключения. В отладочном режиме в библиотеке стоят проверки на наличие этих маркеров, и при их отсутствии библиотека бросает системное исключение.
Вот пожалуйста статья об этом (crt-debug-heap):
https://learn.microsoft.com/en... w=msvc-170
Вот ваш FD:
The no_mans_land buffers on either side of the user data area of the block are currently 4 bytes in size, and are filled with a known byte value used by the debug heap routines to verify that the limits of the user's memory block haven't been overwritten. The debug heap also fills new memory blocks with a known value. If you elect to keep freed blocks in the heap's linked list, these freed blocks are also filled with a known value. Currently, the actual byte values used are as follows:

no_mans_land (0xFD)
The "no_mans_land" buffers on either side of the memory used by an application are currently filled with 0xFD.
Кстати, обращаю внимание на слово currently. Недвусмысленный намек, что это все может измениться в любой новой версии - намек на то, что эксплуатация этих сведений кроме как для отладки (т.е., считай, эксплуатация UB) чревата проблемами в будущем.

Если перейти на GCC\Linux, там вы такого не найдете (но можете найти что-то другое). Если ваш код с привязкой к реализации MS и эксплуатацией UB будет работать в Windows и MSVC, то в GCC уже не будет. О чем я писал. Все эти вещи находятся на пределами C++ и для программирования о них вообще можно не знать.

Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
Для достижения стабильности мне чуть ли исходники операторов тогда надо изучать
Ну если вы собрались делать странное, не программировать на языке, а "хакать" его и его библиотеку, то да, надо будет знать внутренности. Если же писать именно на C++ и не делать дичь вместо этого, то ничего этого не обязательно. Я не говорю, что совсем не нужно - все-таки понимать что делается внутри полезно, но к C++ это будет уже относиться слабо. В любом случае использовать это для программирования логики программ, а не для отладки - точно не нужно.

Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
Прекратите писать ерунду, эту ветку форума просмотрели более 1800 раз, зачем дескридитировать себя, все это читают и видят.
Есть такой рассказ Шукшина - "Срезал". Почитайте на досуге
Пока что дискредитируете себя тут только вы.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1819
Регистрация: 18.10.2014
Сообщений: 17,202
30.05.2024, 20:54
Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
Вообще Windows,Linux,Unix.... написаны на С.
Ох уж эти пионэрские байки в интернете...

Единственная операционная система, которая в какой-то мере могла быть "написана на С" - это тот самый Unix до эпохи System V из конца 70-х годов прошлого века, в процессе работы над которым (и для работы над которым) Денис Ритчи собственно и задумал язык С.
0
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 133
30.05.2024, 21:33  [ТС]
Ух ты сколько букв, и все в прежнем стиле наверное, я боюсь не осилю.))) да еще и какие знатоки пишут мастер красивого письма и дохтор. Я думаю, что кто-нибудь ЭТО прочитает... По делу, друзья мои, по делу пишите. Удачи!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.05.2024, 21:33
Помогаю со студенческими работами здесь

Создание динамических массивов
Здравствуйте! Есть код, решающий важную для меня задачу - находит и выводит все дистанции (расстояния/длины) между точками. И...

Создание динамических массивов
Здравствуйте. Подтолкните в верном направлении. В начале пользователь задаёт количество массивов, потом размер первого массива, потом...

Создание динамических двумерных массивов
Ошибка в том что массиву не дает число массиву Вызвано исключение по адресу 0x006526FC в лаб 3 3.exe: 0xC0000005: нарушение прав доступа...

Создание и размер динамических массивов
Имеется такая задача: Сделал это так: #include "stdafx.h" #include <iostream> #include <array> #include <vector> ...

Индексация многомерных массивов
Почему в C/C++ массивы объявляются так: int array; Это связано как-то с процессом компиляции кода и другими особенностями языка...


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

Или воспользуйтесь поиском по форуму:
50
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru