Динамическая память (Многомерные массивы)
Модератор: Модераторы разделов
-
BratSinot
- Сообщения: 812
- ОС: Slackware64
Динамическая память
Доброго времени суток!
Почему при выделении памяти под многомерный массив нужно извращаться с циклами? Почему-бы просто не сделать malloc(x*y*z)?
И есть ли универсальный алгоритм? А то под двумерный массив нужно так выделять, под трехмерный так, под четырех мерный вообще ничего нет.
Почему при выделении памяти под многомерный массив нужно извращаться с циклами? Почему-бы просто не сделать malloc(x*y*z)?
И есть ли универсальный алгоритм? А то под двумерный массив нужно так выделять, под трехмерный так, под четырех мерный вообще ничего нет.
-
/dev/random
- Администратор
- Сообщения: 5427
- ОС: Gentoo
Re: Динамическая память
Можно и так сделать. Только придётся обращаться к элементу не как foo[a][b][c], а как foo[(a*b_max+b)*c_max+c] (где *_max - размеры). Вы считаете это меньшим извращением?
Ну, начнём с того, что четырёхмерный массив - сам по себе обычно извращение. Верный признак, что вы пишете что-то не то.
Далее. Неужели вы не заметили сходства между этими способами?
Динамический двумерный массив - это просто одномерный массив указателей на одномерные массивы. Выделяем одномерный массив укзателей, затем выделяем соответствующее количество одномерных массивов целевого типа и присваиваем их указатели элементам первого.
Трёхмерный - это одномерный массив указателей на двумерные. Выделяем одномерный массив указателей и заполняем его указателями на двумерные, выделенные способом выше.
Четырёхмерный - это одномерный массив указателей на трёхмерные. Выделяем одномерный массив указателей и заполняем его указателями на трёхмерные, выделенные способом выше.
...
Стомерный - это одномерный массив указателей на девяностодевятимерные. Выделяем одномерный массив указателей и заполняем его указателями на девяностодевятимерные, выделенные способом выше.
...
inf
Спасибо сказали:
-
alienrom
- Сообщения: 142
- ОС: GNU/Linux, BSD
-
deadhead
- Сообщения: 1913
- Статус: zzz..z
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Динамическая память
потому что работать с указателями на указатели на указатели быстрее, чем с указателем на единый кусок, в котором всё лежит. Если вам конечно нужны быстрые вставки/удаления строк/столбцов.
гиперкубические четырёхмерные матрицы?! зачем?
-
Reboot
- Сообщения: 321
- Статус: Красен глаз -- темна душа
Re: Динамическая память
гиперкубические четырёхмерные матрицы?! зачем?
может это из учебная задачка.
Мой компьютер зовут Марвин
-
deadhead
- Сообщения: 1913
- Статус: zzz..z
Re: Динамическая память
[x] close
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Динамическая память
та я понял. просто на практике мне не попадалось :)
-
BratSinot
- Сообщения: 812
- ОС: Slackware64
Re: Динамическая память
Блин, народ че вы сработали на 4D? Я просто пример привел.
P.S. Трехмерные матрицы то не особо используются. И в OpenGL и в математике двумерные.
P.S. Трехмерные матрицы то не особо используются. И в OpenGL и в математике двумерные.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Динамическая память
дык и я про то. но на 2D довольно просто вставлять строки, а вот в 4D достаточно сложно (если у вас нет никакой организации, просто X*Y*Z*T данных непрерывно).
-
Subj
- Сообщения: 151
- Статус: Useful
- ОС: win
Re: Динамическая память
Не благодарное это дело работать с многомерными массивами на языке, который не особо то их и умеет
Код: Выделить всё
with Ada.Text_IO;
procedure Test is
type D4_Array is array (Positive range <>,
Positive range <>,
Positive range <>,
Positive range <>) of Positive;
type D4_Access is access D4_Array;
D4 : D4_Access := new D4_Array (1 .. 2, 1 .. 3, 1 .. 4, 1 .. 5);
begin
D4.all := (others => (others => (others => (others => 1))));
Ada.Text_IO.Put_Line (D4 (1,2,3,4)'Img);
end Test;Building better software with Ada
-
BratSinot
- Сообщения: 812
- ОС: Slackware64
Re: Динамическая память
Не благодарное это дело работать с многомерными массивами на языке, который не особо то их и умеет
a[][][][][] это не умеет?
-
Reboot
- Сообщения: 321
- Статус: Красен глаз -- темна душа
Re: Динамическая память
a[][][][][] это не умеет?
скажем честно: массив массивов это не многомерный массив, а массив массивов.
Мой компьютер зовут Марвин
-
/dev/random
- Администратор
- Сообщения: 5427
- ОС: Gentoo
-
Reboot
- Сообщения: 321
- Статус: Красен глаз -- темна душа
Re: Динамическая память
это одна из форм представления многомерного массива
мне кажется, что в этой фразе уже чётко показана разница между многомерным массивом и массивом массивов.
// Хотя на практике такое занудство и не нужно.
Мой компьютер зовут Марвин
-
BratSinot
- Сообщения: 812
- ОС: Slackware64
Re: Динамическая память
Тогда многомерных массивов не существует. Трехмерные бывают только CPU и то эту технологию не развивают.
-
kt315e
- Сообщения: 318
- ОС: Debian 11
Re: Динамическая память
Представление массива и соответственно способ выделения для него памяти определяется двумя обстоятельствами -- совместимостью с применяемыми библиотеками и соответсвие решаемой задаче.
-
BratSinot
- Сообщения: 812
- ОС: Slackware64
Re: Динамическая память
Представление массива ни от чего не зависит. Один черт, в памяти массив последовательно находится.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Динамическая память
привет, Kэп!
/dev/random писал(а): ↑21.04.2011 23:48Разве? А по-моему, это одна из форм представления многомерного массива.
да, в котором очень дорогие операции вставки/удаления строк/столбцов. Кроме того, такое представление не подходит для разряжённых массивов.
существуют. например массив указателей на массивы. списки, деревья, и т.д. и т.п..
ну это только в вашем коде так.
-
BratSinot
- Сообщения: 812
- ОС: Slackware64
Re: Динамическая память
существуют. например массив указателей на массивы. списки, деревья, и т.д. и т.п..
Тот человек возможно указывал про физическую составляющую, вот я и сказал с физической точки зрения.
ну это только в вашем коде так.
О! Для меня компиляторы эксклюзивный код делают? Здорого!
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Динамическая память
что это значит? я какой код хочу писать, тот и пишу. хочу - будет дерево.
та не, вы просто другого не знаете видимо, раз в вашем коде другого нет...
-
BratSinot
- Сообщения: 812
- ОС: Slackware64
Re: Динамическая память
что это значит? я какой код хочу писать, тот и пишу. хочу - будет дерево.
ФИЗИЧЕСКАЯ составляющая. Физическая==СУЩЕСТВУЮЩАЯ в реальном мире. Память она по сути дела в плоскости.
та не, вы просто другого не знаете видимо, раз в вашем коде другого нет...
Интересно, а как еще можно массив расположить в памяти ежели не последовательно? Как? Правильно, никак.
-
Crazy
- Сообщения: 862
- Статус: Адепт Дзен.
- ОС: Mint, Win7.
Re: Динамическая память
Не физическая, а математическая составляющая это вектор.
Хоть дерево, хоть хеш-таблица.
Общее описание это позволяет.
Массив — Упорядоченный набор данных, для хранения данных одного типа, идентифицируемых с помощью одного или нескольких индексов. В простейшем случае массив имеет постоянную длину и хранит единицы данных одного и того же типа.
Desipere in loco
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Динамическая память
IRL она всегда была иерархической древовидной. "Плоской" она является только в голове прикладного кодера, да и то не всегда.
да как угодно. Кнута почитайте. Мне лекции по азам программирования лень читать...
-
kt315e
- Сообщения: 318
- ОС: Debian 11
Re: Динамическая память
Интересно, а как еще можно массив расположить в памяти ежели не последовательно? Как?
Последовательно в памяти можно расположить по разному
Например для двумерных массивов: первый стобец второй столбец третий стобец
или
первая строка вторая строка третья строка
Причем в разных языках/вычислительных системах по разному.
Наступить в эту каку легко.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Динамическая память
проще всего вообще никак не располагать - пусть система сама голову ломает. т.е. выполнить оператор new необходимое количество раз.
-
landgraf
- Сообщения: 2142
- Статус: *бунту ненавистник
- ОС: linux
Re: Динамическая память
вербовка новых адептов Ада Ada :)) давай-давай
-
jojahti
- Сообщения: 310
Re: Динамическая память
alienrom
А если например трёхмерная графика. Координаты каждого пикселя плюс значения RGB, там прозрачности всякие.
Скажите, какая-такая задача возникла, что нужно 4х мерный массив?
А если например трёхмерная графика. Координаты каждого пикселя плюс значения RGB, там прозрачности всякие.
-
eddy
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: Динамическая память
Здесь не нужен четырехмерный массив - хватит линейного массива структур {координаты, цвета}.
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка