|
1 / 1 / 1
Регистрация: 20.01.2013
Сообщений: 80
|
|
Передача по ссылке двумерного динамического массива в функцию24.12.2015, 05:01. Показов 25127. Ответов 114
Метки нет (Все метки)
0
|
|
| 24.12.2015, 05:01 | |
|
Ответы с готовыми решениями:
114
Передача двумерного массива в функцию по ссылке Передача динамического двумерного массива в функцию Передача двумерного динамического массива в функцию |
|
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
|
||||||||
| 24.12.2015, 19:46 | ||||||||
|
Добавлено через 7 минут Приведи мне серьёзного автора, который такое утверждает. Тебя слушать? А ты, собственно, кто? Молодец среди овец?
0
|
||||||||
|
Неэпический
|
||
| 24.12.2015, 19:51 | ||
|
new-expression размещает там где-то массив, но возвращает указатель на первый элемент, а не массив. Динамический(динамически выделенный) - выделен в рантайме. Динамический не значит расширяемый. Динамический(расширяемый) - не существует.
1
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 24.12.2015, 19:53 | |||
|
нужно понимать услышанное. Прата - педагог, который написал книгу для деццкого садика. он специально максимально упростил материал, что бы детишки смогли переварить его. вот только деццкий садик уже позади. пора взрослеть. что служит толчком к дальнейшему развитию. иногда для этого нужно попачкать страничку другую ![]() Не по теме: когда то были времена, я не особо понимал,
1
|
|||
| 24.12.2015, 19:57 | |
|
0
|
|
|
1682 / 1098 / 489
Регистрация: 17.07.2012
Сообщений: 5,361
|
|||
| 24.12.2015, 20:08 | |||
|
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 24.12.2015, 20:13 | ||
|
и нет никакой встроенной поддержки от компилятора. (когда вы осознаете миф о динамических массивах, тогда следующим вашим шагом будет понимание, что такая поддержка на самом деле нафиг не нужна) через new на самом деле тупо выделяется энное количество байт - непрерывный кусок сырой памяти, которая инициализируется запусками конструкторов. после чего вам наруки выдают сырой указатель на начало этого блока. вот и вся история. никакого массива у вас при этом на руках нет, и никогда не было. при этом, то, на что на самом деле указывает указатель - это лишь в голове программиста. например, когда компилятор встречает в коде указатель: int* p то он думает, что указатель содержит адрес объекта типа int а то, что там оказывается подразумевается целый массив данных - об этом знает только программист, который написал этот код.
2
|
||
|
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
|
|||||||
| 24.12.2015, 21:47 | |||||||
|
Динамически создаваемых тоже не существует? Известен размер? Динамически создаваемого тоже известен, только программисту недоступен через указатель. Поэтому это не массив? Или дай своё определение массива. Оно, вообще, существует в стандарте, в языке? За тебя попытаюсь дать твоё определение массива: если компилятор, встретив указатель (имя массива), знает, что это указатель на непрерывный блок памяти известного размера, то это указатель на начало именно массива (имеем массив), если встретив указатель (и нет подсказки программиста) думает, что указатель содержит адрес только одного объекта известного типа, то это не указатель на начало массива (массива не имеем). Так? Добавлено через 10 минут
0
|
|||||||
|
Неэпический
|
|||||||||||||||||||||
| 24.12.2015, 22:05 | |||||||||||||||||||||
А что там внутри уже детали реализации (там может быть метаинформация). А вот когда он встречает массив, он знает его размер, потому как это массив, а не сырой указатель. Добавлено через 4 минуты Добавлено через 1 минуту Для тебя:
0
|
|||||||||||||||||||||
|
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
|
|||||||||
| 24.12.2015, 22:13 | |||||||||
0
|
|||||||||
|
1682 / 1098 / 489
Регистрация: 17.07.2012
Сообщений: 5,361
|
|||
| 24.12.2015, 22:14 | |||
|
0
|
|||
|
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
|
||||
| 24.12.2015, 22:21 | ||||
|
Добавлено через 1 минуту Добавлено через 1 минуту
0
|
||||
|
1682 / 1098 / 489
Регистрация: 17.07.2012
Сообщений: 5,361
|
|
| 24.12.2015, 22:25 | |
|
0
|
|
|
Неэпический
|
||||||
| 24.12.2015, 22:27 | ||||||
А теперь что такое "статический тип" массив:
А потому что разрешен неявный каст
new-expression(который с []) выделяет кусок памяти, достаточный для хранения n элементов некоторого типа (ну и инициализирует всё это добро по определенным правилам). Этим типом может быть массив, а может и не быть. В силу того, что кусок памяти непрерывный, чаще его называют его массивом (потому что общий термин массив таков).
0
|
||||||
|
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
|
|||
| 24.12.2015, 23:48 | |||
|
Уф, на этом можно и остановиться...
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||
| 24.12.2015, 23:57 | ||||||||||||||||
|
потому что динамически создаваемый - тупо времени выполнения вот вам пример:
аккуратнее с формулировками. конкретизируйте свой вопрос. динамически создаваемый - это: 1. создаваемый времени выполнения? 2. имеющий динамический класс хранения? 3. размерности массива известны лишь времени выполнения? что именно вы имеете ввиду? это - только начало истории. имя массива внезапно - имя массива, а не имя указателя. вапще указатели с массивами только новобранцы путают. они пока ещё не осознали профит от использования массивов. поддержка от компилятора: поскольку размерности известны времени выполнения, то компилятор знает размерности всех массивов. грубо говоря, представьте себе, что массив "помнит" свои размерности. эту информацию можно извлекать времени компиляции, и использовать. например, гарантировать безопасность выхода за пределы диапазона массива. безопасность кстати - краеугольный камень преткновения массивов. самый быстрый в мире контейнер, теперь ещё и безопасный. благодаря своим свойствам, обработку массивов на с++ можно сделать инвариантной что в принципе не возможно сделать на небезопасных указателях. поскольку массив - полноценный составной тип данных, то на него действуют правила перегрузок. мы можем например, написать две перегрузки: первая будет принимать безопасные массивы, а вторая - небезопасные указатели. и реализовывать таким образом различные сценарии бизнес-логики. при сдыхании, массив зовет диструкторы, ну и многое другое. короче - полноценный механизм. не просто подсказывает, а прямо таки приказывает грохнуть память по указателю. вы можете подсунуть абсолютно любой, совершенно левый указатель, и приказать грохнуть память. компилятор не телепат, он понятия не имеет, что там под этим указателем. ему сказали, он сделает. потом будет краш. видите ли, массив - это тип данных, который трактуется однозначно "я - массив". а вот на указателе нигде не написано, на что он там указывает. о том, как нужно интерпретировать данные по указателю знает только программист. delete [] - это приказ программиста интерпретировать данные по указателю, как блок памяти, выделенный при помощи new[] без подсказки программиста он в принципе понятия не имеет, что там за данные по указателю. даже если его тыкнуть мордой: delete[] p то он все равно ничего не знает о том, что там за данные, и какие там размеры у объектов. для компилятора delete[] p это примерно тоже самое, что и free(p) а что там внутри этой функции - ему до фонаря, что там написано, то он и сделает. а написано там нечто, что очень сильно зависит от конкретной платформы. это уже никак не стандартизировано, тут может быть все, что угодно. самая популярная реализация следующая: выражение:
[хвостик][some 0][some 1] при этом возвращаемый адрес - адрес, где начинается нулевой элемент. то есть про хвостик, мы как бы ничего не знаем. в хвост записываются мета-данные: количество элементов, ещё может быть какая нибудь отладочная инфа, и тп. соответственно, delete[] p берет адрес p и отматывается от него назад на размер хвоста. и получает информацию из этого хвостика. узнает о количестве элементов и тд. получив информацию о блоке данных, запрашивает рантайм с++ об уничтожении блока. но фишка в том, что никто кроме программиста не знает, что на самом деле находится по указателю. и если вы скормите delete[] какой нибудь левый указатель, то она его схавает. точно так же отмотается до хвоста, прочитает полный бред, и сожрет его. а потом ось грохнет все приложение со словами: "вы че там, с ума посходили?" new-expression в этом месте сахарком посыплен. туда можно реально тип данных вкрячить, а можно вкрячить "имитацию" с размерностью известной лишь времени выполнения. (только для одной размерности). во втором случае оно выглядит как массив, но массивом уже не является. думаю этот момент больше всего сбивает с толку. потому что выглядит как массив, размерность которого можно указать динамически. создается иллюзия: о боже! динамический массив еще есть "массив данных" - просто набор каких то однородных данных, расположенных один за другим. а есть "массив" - тип данных, декларированный в стандарте, имеющий опр. синтаксис и бла бла бла. в общении и то, и другое часто называют просто массивами, что вызывает путаницу, которая и приводит к тому, что некоторым товарищам не очевидна принципиальная разница между этими понятиями. говоря о массиве, мы подразумеваем тип данных, со всеми его свойствами. а говоря о массиве данных, мы ничего такого уже подразумевать не можем. для нас это уже не более, чем структура однородны данных, по известному адресу.
7
|
||||||||||||||||
| 25.12.2015, 00:04 | |
|
0
|
|
|
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
|
|
| 25.12.2015, 00:13 | |
|
Спасибо hoggy, и Croessmah, нужно обдумать всё это. Я уже было подумал, что вернулся в исходную точку, но hoggy, последним постом (особенно насчёт работы delete []), посеял зерно сомнения.
0
|
|
|
Неэпический
|
|
| 25.12.2015, 00:18 | |
|
nord_v, всё дело именно в терминах.
Например, те же переводчики переводят operator и statement одинаково - оператор, в результате новички просто не понимают различий, отсюда всякие косяки в синтаксисе, непонимание что к чему относится и как разбирается. Также stream и thread переводятся одинаково - поток. В результате почти каждое приложение можно назвать многопоточным. Тоже и с путаницей между оператором new и new-выражением. Такая же беда и со статическими переменными (имеющими статическое время хранения и переменными, созданными не в динамике). И, как видите, с массивами тоже.
1
|
|
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
|
|
| 25.12.2015, 00:34 | |
|
Если бы в русский язык были введены подобные аббревиатуры, то не было бы бесконечной войны из-за наследия С в С++
Я это как пример просто, примененной ниже терминологии сегодня не существует, но она как-то проще, более по-русски что ли. 1) Массив ФРСВВК (массив фиксированных размеров создаваемый во время компиляции) 2) Статический массив ФРСВВК (массив ФРСВВК с ключевым словом static) ========================== 3) Массив ФРСВВВ (массив фиксированных размеров создаваемый во время выполнения) 4) Статический массив ФРСВВВ ========================== 5) Массив ИРВВ (массив изменяющихся размеров во время выполнения, он же динамический, он же расширяемый). В С++ не существует, но есть готовые реализации такого функционала в стандартной библиотеке... (опять же тут допущения, ведь это псевдо ИРВВ) ========================== Такое разделение массивов на группы. Легче бы шли объяснения. При этом то, что начинается здесь с 3 вида, оно уже не массив внутри ПК, но зато массив в головах программиста. сейчас могу сплоховать, но если как-то не так выражусь, пусть поправят. В С++ вообще нет многомерных массивов, так как память линейна. Поэтому о многомерных массивах "ИРВВ" вообще говорить бессмысленно. Нельзя расширить то, что аксиомой не существует в природе.Тут на самом деле лежат похожие грабли на те, которые заставляют считать, что указатель на массив массивом является, что вектор - это полноценный динамический массив и т.п. Подумаешь фигня какая, неправильная терминология, удобно же, зато большинство понимает как хочет, а совсем не как следует. Любой многомерный массив - это массив массивов, в конечнем счете в конечном массиве всегда массив ФР(фиксированных размеров). В теории получается, что Многомерный массив ИРВВ - это массив, в который добавляется/из которого урезается одна или несколько размерностей. На самом деле оно реализуется по тем же принципам, по которым создается массив "ИРВВ". А то, что оно не подано на блюдечке, наверное хорошо, потому что для таких вещей уже идут структуры struct. Но можно написать свой велосипед. Ведь С++ расширяемый язык. И будет псевдорасширяемый многомерный массив. ==========================
0
|
|
| 25.12.2015, 00:34 | |
|
Передача двумерного динамического массива в функцию построчно и сортировка Передача динамического двумерного массива в процедуру Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни
1. Механизм отложенного высвобождения фосфора
Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ
Реализована разная скорость. . .
|
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2.
Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
|
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её.
Всё это стресс конечно. Почему?. . .
|
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот.
Ларри Уингет
|
|
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|