Динамическая память (Многомерные массивы)

Модератор: Модераторы разделов

BratSinot
Сообщения: 812
ОС: Slackware64

Динамическая память

Сообщение BratSinot »

Доброго времени суток!

Почему при выделении памяти под многомерный массив нужно извращаться с циклами? Почему-бы просто не сделать malloc(x*y*z)?
И есть ли универсальный алгоритм? А то под двумерный массив нужно так выделять, под трехмерный так, под четырех мерный вообще ничего нет.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: Динамическая память

Сообщение /dev/random »

BratSinot писал(а):
17.04.2011 23:36
Почему при выделении памяти под многомерный массив нужно извращаться с циклами? Почему-бы просто не сделать malloc(x*y*z)?

Можно и так сделать. Только придётся обращаться к элементу не как foo[a][b][c], а как foo[(a*b_max+b)*c_max+c] (где *_max - размеры). Вы считаете это меньшим извращением?

BratSinot писал(а):
17.04.2011 23:36
И есть ли универсальный алгоритм? А то под двумерный массив нужно так выделять, под трехмерный так, под четырех мерный вообще ничего нет.

Ну, начнём с того, что четырёхмерный массив - сам по себе обычно извращение. Верный признак, что вы пишете что-то не то.
Далее. Неужели вы не заметили сходства между этими способами?
Динамический двумерный массив - это просто одномерный массив указателей на одномерные массивы. Выделяем одномерный массив укзателей, затем выделяем соответствующее количество одномерных массивов целевого типа и присваиваем их указатели элементам первого.
Трёхмерный - это одномерный массив указателей на двумерные. Выделяем одномерный массив указателей и заполняем его указателями на двумерные, выделенные способом выше.
Четырёхмерный - это одномерный массив указателей на трёхмерные. Выделяем одномерный массив указателей и заполняем его указателями на трёхмерные, выделенные способом выше.
...
Стомерный - это одномерный массив указателей на девяностодевятимерные. Выделяем одномерный массив указателей и заполняем его указателями на девяностодевятимерные, выделенные способом выше.
...
inf
Спасибо сказали:
Аватара пользователя
alienrom
Сообщения: 142
ОС: GNU/Linux, BSD

Re: Динамическая память

Сообщение alienrom »

BratSinot писал(а):
17.04.2011 23:36
под четырех мерный вообще ничего нет.

Скажите, какая-такая задача возникла, что нужно 4х мерный массив?
Спасибо сказали:
Аватара пользователя
deadhead
Сообщения: 1913
Статус: zzz..z

Re: Динамическая память

Сообщение deadhead »

alienrom писал(а):
18.04.2011 00:11
Скажите, какая-такая задача возникла, что нужно 4х мерный массив?
очевидно же - матрица!
BratSinot
Архитектор перелогиньтесь! ;-)

[x] close
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Динамическая память

Сообщение drBatty »

BratSinot писал(а):
17.04.2011 23:36
Почему при выделении памяти под многомерный массив нужно извращаться с циклами? Почему-бы просто не сделать malloc(x*y*z)?

потому что работать с указателями на указатели на указатели быстрее, чем с указателем на единый кусок, в котором всё лежит. Если вам конечно нужны быстрые вставки/удаления строк/столбцов.

deadhead писал(а):
18.04.2011 08:09
очевидно же - матрица!

гиперкубические четырёхмерные матрицы?! зачем?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Reboot
Сообщения: 321
Статус: Красен глаз -- темна душа

Re: Динамическая память

Сообщение Reboot »

гиперкубические четырёхмерные матрицы?! зачем?

может это из учебная задачка.
Мой компьютер зовут Марвин
Спасибо сказали:
Аватара пользователя
deadhead
Сообщения: 1913
Статус: zzz..z

Re: Динамическая память

Сообщение deadhead »

Reboot писал(а):
18.04.2011 11:03
может это из учебная задачка.
скорее из фильма;-)
[x] close
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Динамическая память

Сообщение NickLion »

drBatty писал(а):
18.04.2011 10:19
deadhead писал(а):
18.04.2011 08:09
очевидно же - матрица!

гиперкубические четырёхмерные матрицы?! зачем?

Моделирование 3-х мерного мира со временем на вокселях. ;) Это фильм "Матрица" имелся в виду. Архитектор оттуда же.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Динамическая память

Сообщение drBatty »

NickLion писал(а):
18.04.2011 11:21
Моделирование 3-х мерного мира со временем на вокселях. wink.gif Это фильм "Матрица" имелся в виду. Архитектор оттуда же.

та я понял. просто на практике мне не попадалось :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Динамическая память

Сообщение BratSinot »

Блин, народ че вы сработали на 4D? Я просто пример привел.
P.S. Трехмерные матрицы то не особо используются. И в OpenGL и в математике двумерные.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Динамическая память

Сообщение drBatty »

BratSinot писал(а):
18.04.2011 17:01
Блин, народ че вы сработали на 4D? Я просто пример привел.
P.S. Трехмерные матрицы то не особо используются. И в OpenGL и в математике двумерные.

дык и я про то. но на 2D довольно просто вставлять строки, а вот в 4D достаточно сложно (если у вас нет никакой организации, просто X*Y*Z*T данных непрерывно).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Subj
Сообщения: 151
Статус: Useful
ОС: win

Re: Динамическая память

Сообщение Subj »

Не благодарное это дело работать с многомерными массивами на языке, который не особо то их и умеет ;)

Код: Выделить всё

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: Динамическая память

Сообщение BratSinot »

Не благодарное это дело работать с многомерными массивами на языке, который не особо то их и умеет

a[][][][][] это не умеет?
Спасибо сказали:
Аватара пользователя
Reboot
Сообщения: 321
Статус: Красен глаз -- темна душа

Re: Динамическая память

Сообщение Reboot »

a[][][][][] это не умеет?

скажем честно: массив массивов это не многомерный массив, а массив массивов.
Мой компьютер зовут Марвин
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: Динамическая память

Сообщение /dev/random »

Reboot писал(а):
21.04.2011 23:38
скажем честно: массив массивов это не многомерный массив, а массив массивов.

Разве? А по-моему, это одна из форм представления многомерного массива.
Спасибо сказали:
Аватара пользователя
Reboot
Сообщения: 321
Статус: Красен глаз -- темна душа

Re: Динамическая память

Сообщение Reboot »

это одна из форм представления многомерного массива

мне кажется, что в этой фразе уже чётко показана разница между многомерным массивом и массивом массивов.

// Хотя на практике такое занудство и не нужно.
Мой компьютер зовут Марвин
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Динамическая память

Сообщение BratSinot »

Reboot писал(а):
22.04.2011 00:06
это одна из форм представления многомерного массива

мне кажется, что в этой фразе уже чётко показана разница между многомерным массивом и массивом массивов.

// Хотя на практике такое занудство и не нужно.

Тогда многомерных массивов не существует. Трехмерные бывают только CPU и то эту технологию не развивают.
Спасибо сказали:
Аватара пользователя
kt315e
Сообщения: 318
ОС: Debian 11

Re: Динамическая память

Сообщение kt315e »

Представление массива и соответственно способ выделения для него памяти определяется двумя обстоятельствами -- совместимостью с применяемыми библиотеками и соответсвие решаемой задаче.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Динамическая память

Сообщение BratSinot »

kt315e писал(а):
22.04.2011 21:34
Представление массива и соответственно способ выделения для него памяти определяется двумя обстоятельствами -- совместимостью с применяемыми библиотеками и соответсвие решаемой задаче.

Представление массива ни от чего не зависит. Один черт, в памяти массив последовательно находится.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Динамическая память

Сообщение drBatty »

Reboot писал(а):
21.04.2011 23:38
скажем честно: массив массивов это не многомерный массив, а массив массивов.

привет, Kэп!
/dev/random писал(а):
21.04.2011 23:48
Разве? А по-моему, это одна из форм представления многомерного массива.

да, в котором очень дорогие операции вставки/удаления строк/столбцов. Кроме того, такое представление не подходит для разряжённых массивов.
BratSinot писал(а):
22.04.2011 00:16
Тогда многомерных массивов не существует.

существуют. например массив указателей на массивы. списки, деревья, и т.д. и т.п..
BratSinot писал(а):
22.04.2011 22:45
Представление массива ни от чего не зависит. Один черт, в памяти массив последовательно находится.

ну это только в вашем коде так.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Динамическая память

Сообщение BratSinot »

существуют. например массив указателей на массивы. списки, деревья, и т.д. и т.п..

Тот человек возможно указывал про физическую составляющую, вот я и сказал с физической точки зрения.

ну это только в вашем коде так.

О! Для меня компиляторы эксклюзивный код делают? Здорого!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Динамическая память

Сообщение drBatty »

BratSinot писал(а):
23.04.2011 13:49
Тот человек возможно указывал про физическую составляющую, вот я и сказал с физической точки зрения.

что это значит? я какой код хочу писать, тот и пишу. хочу - будет дерево.
BratSinot писал(а):
23.04.2011 13:49
О! Для меня компиляторы эксклюзивный код делают? Здорого!

та не, вы просто другого не знаете видимо, раз в вашем коде другого нет...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Динамическая память

Сообщение BratSinot »

что это значит? я какой код хочу писать, тот и пишу. хочу - будет дерево.

ФИЗИЧЕСКАЯ составляющая. Физическая==СУЩЕСТВУЮЩАЯ в реальном мире. Память она по сути дела в плоскости.

та не, вы просто другого не знаете видимо, раз в вашем коде другого нет...

Интересно, а как еще можно массив расположить в памяти ежели не последовательно? Как? Правильно, никак.
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Динамическая память

Сообщение Crazy »

BratSinot писал(а):
23.04.2011 21:05
ФИЗИЧЕСКАЯ составляющая. Физическая==СУЩЕСТВУЮЩАЯ в реальном мире. Память она по сути дела в плоскости.

Не физическая, а математическая составляющая это вектор.

BratSinot писал(а):
23.04.2011 21:05
Интересно, а как еще можно массив расположить в памяти ежели не последовательно? Как? Правильно, никак.

Хоть дерево, хоть хеш-таблица.
Общее описание это позволяет.
Массив — Упорядоченный набор данных, для хранения данных одного типа, идентифицируемых с помощью одного или нескольких индексов. В простейшем случае массив имеет постоянную длину и хранит единицы данных одного и того же типа.


Desipere in loco
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Динамическая память

Сообщение drBatty »

BratSinot писал(а):
23.04.2011 21:05
ФИЗИЧЕСКАЯ составляющая. Физическая==СУЩЕСТВУЮЩАЯ в реальном мире. Память она по сути дела в плоскости.

IRL она всегда была иерархической древовидной. "Плоской" она является только в голове прикладного кодера, да и то не всегда.
BratSinot писал(а):
23.04.2011 21:05
Интересно, а как еще можно массив расположить в памяти ежели не последовательно? Как?

да как угодно. Кнута почитайте. Мне лекции по азам программирования лень читать...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
kt315e
Сообщения: 318
ОС: Debian 11

Re: Динамическая память

Сообщение kt315e »

Интересно, а как еще можно массив расположить в памяти ежели не последовательно? Как?

Последовательно в памяти можно расположить по разному :)
Например для двумерных массивов: первый стобец второй столбец третий стобец
или
первая строка вторая строка третья строка

Причем в разных языках/вычислительных системах по разному.
Наступить в эту каку легко.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Динамическая память

Сообщение drBatty »

kt315e писал(а):
30.04.2011 18:27
Последовательно в памяти можно расположить по разному

проще всего вообще никак не располагать - пусть система сама голову ломает. т.е. выполнить оператор new необходимое количество раз.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
landgraf
Сообщения: 2142
Статус: *бунту ненавистник
ОС: linux

Re: Динамическая память

Сообщение landgraf »

Subj писал(а):
21.04.2011 16:55
Не благодарное это дело работать с многомерными массивами на языке, который не особо то их и умеет wink.gif

вербовка новых адептов Ада Ada :)) давай-давай
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: Динамическая память

Сообщение jojahti »

alienrom
Скажите, какая-такая задача возникла, что нужно 4х мерный массив?

А если например трёхмерная графика. Координаты каждого пикселя плюс значения RGB, там прозрачности всякие.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Динамическая память

Сообщение eddy »

jojahti писал(а):
06.05.2011 13:45
А если например трёхмерная графика. Координаты каждого пикселя плюс значения RGB, там прозрачности всякие.

Здесь не нужен четырехмерный массив - хватит линейного массива структур {координаты, цвета}.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали: