|
1 / 1 / 1
Регистрация: 20.01.2013
Сообщений: 80
|
|
Передача по ссылке двумерного динамического массива в функцию24.12.2015, 05:01. Показов 25038. Ответов 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 | |
|
Передача двумерного динамического массива в функцию построчно и сортировка Передача динамического двумерного массива в процедуру Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0»
https:/ / ibb. co/ NnkGpfMd
Представленная интегрированная схема описывает непрерывную нелинейную. . .
|
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы
### Аннотация
Представлено исследование по разработке агентной модели микоризной. . .
|
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики
Контекст
Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
|
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии
Введение
Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
|
|
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np
class PlantAgent:
def __init__(self, name, strategy, initial_biomass):
self. name = name
self. strategy = strategy # "greedy" (широколиственные) или. . .
|
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли
Введение: Экологический рынок как игра с нулевой суммой
Традиционная экология долгое время. . .
|
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ
Введение: Синдром «цифрового учебника»
Современные большие языковые модели (LLM) обладают колоссальным. . .
|
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос.
Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех.
А широколиственный лес тоже имеет самую крутую биомассу.
То почему не возникло их симбиоза? Это. . .
|