Трехмерный динамический массив c

Трехмерный динамический массив c

Я больше по Java, но сейчас надо сделать пару задачек по плюсам. Одна из них звучит как-то так:

Введя значения m,n,r, определить трехмерный массив P = размерами i,j,k, где i=1,n;j=1,m;k=1,r. Значения элементов которого определяются случайно.

Упустим тот момент, что преподаватель не знает, что в плюсах массив считается с нуля. С malloc/free не работал в плюсах, а тем более с трехмерными массивами, так что понятия не имею, как это делается. Надо использовать malloc/free.

2 ответа 2

Трехмерный массив можно представить как правильный многогранник или же двумерные массивы, уложенные по слоям.

Соответственно легче ориентироваться как в декартовой системе координат, проставив оси X,Y,Z на соответствующих направлениях. Сначала создаются слои, от ближнего к дальнему:

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

Вот в общем-то и все, остается только заполнить рандомными числами. Полный пример(если я нигде не намудрил с памятью):

Учитывая, что malloc/free практически ничем не отличаются в плане выделения памяти(вообще это сишный вариант выделения памяти), стоит только заменить new на его эквивалент. Вот тут не уверен, но возможно это будет выглядеть так:

Не знаю, как другие компиляторы, а gcc (но не g++) позволяет передавать в функцию размерности измерений матрицы в ее аргументах.

Это позволяет не моделировать 2-х и 3-х мерные массивы, как показал в своем ответе @Alex Krass массивами указателей, а выделить одну последовательную область памяти нужного размера и разместить многомерный массив в ней. Т.е. практически так же, как делает компилятор, когда размер каждого измерения известен при компиляции (константа).

Читайте также:  Как удалить свою учетную запись агента

Обратите внимание на приведение типа при передаче указателя в функции.

Транслируем (ключ -std=c99 нужен исключительно для описаний индексов в стиле C++) и запускаем

Возможно, это не то, что хотел преподаватель, но как и многое в GNU достаточно практично.

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

Массивы. Часть 2. Многомерные массивы. Ступенчатые массивы

Содержание

1. Какой массив называется многомерным?

Многомерный массив – это массив, который имеет два и более измерений. Для доступа к элементу многомерного массива используется комбинация из двух и более индексов.

2. Какая общая форма объявления многомерного массива?

Общая форма объявления многомерного массива следующая:

  • тип – непосредственно тип элементов массива;
  • размер1 , размер2 , размерN – размерность каждого измерения массива. Значение N означает, что массив N -мерный.

3. Пример объявления и использования двумерного массива вещественных чисел размером 3×4

В примере объявляется двумерный массив вещественных чисел, которые имеют тип float

4. Пример объявления и использования трехмерного массива целых чисел размером 3×4×5

5. Как выглядит общая форма инициализации многомерного массива?

Инициализация массива позволяет записать значения в ячейки массива в момент его объявления в программе.

Общая форма инициализации многомерного массива имеет следующий вид:

  • тип – тип элементов массива;
  • значение – значение, которыми инициализируются элементы массива.

6. Пример инициализации двумерного массива размером 5×3. Элементы массива имеют тип char

7. Пример инициализации трехмерного массива целых чисел размером 2×3×4

8. Что такое ступенчатый массив? Какая общая форма объявления ступенчатого массива?

Двумерные массивы могут быть двух видов:

  • прямоугольный массив в виде таблицы;
  • ступенчатый массив. В этом массиве количество элементов каждой строки (массива) может отличаться. Ступенчатый массив еще называют массивом массивов.
Читайте также:  Что такое байт код

Общая форма объявления ступенчатого массива:

  • тип – тип элементов массива;
  • размер – количество строк в массиве.

9. Пример объявления и использования ступенчатого массива

Как видно из примера, доступ к элементам ступенчатого массива происходит иначе чем в прямоугольном массиве.

10. В каких случаях целесообразно использовать ступенчатые массивы?

Ступенчатые массивы являются эффективными в случаях, если у двумерных прямоугольных массивов есть много элементов, которые вообще не используются. Это позволяет сэкономить память за счет выделения только необходимого объема памяти (количества элементов) для каждой строки ступенчатого массива.

На рисунке 1 отображено преимущество применения ступенчатых массивов в сравнении с прямоугольными. Продемонстрирована возможная экономия памяти в случае, когда данные представляются прямоугольным массивом в котором все элементы некоторых строк (0, 2, 3, 4) не используются.

Способ 1. Объявление прямоугольного массива с именем M .

Способ 2. Объявление ступенчатого массива.

Рис. 1. Пример экономии памяти с помощью ступенчатого массива из 5 строк в сравнении с прямоугольным массивом размером 5×100

11. Каким образом реализовать массив двумерных массивов? Пример

В примере реализуется массив двумерных массивов с именем M . Массив имеет 10 строк. В каждой строке формируется двумерный массив размером 3×4.

Спасибо) а почему в четырёхмерном массиве в строке создания дополнительных массивов вместо :

*(mas + t) = new double*[l];

как в трёхмерном, надо уже

**(mas + t) = new double*[l];(ещё звёздочка впереди)

соответственно массив массивов указателей на массивы) ) ) первый массив — массив указателей на указатели, второй — массив указателей на массивы данных, ну и третий сами массивы данных

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

создание указателя на область памяти: инт *мас;

привязка к этой области конкретное количество элементов: *мас =нью инт (к) ;

Читайте также:  Что такое пароль и логин

при статическом создании массива, также можно обращаться через указатели, т. е. *(мас + у)

что-то мне в дополнении не нравится; ) на каждом этапе слева на одну звездочку больше должно получаться
//

т. е. трехмерн ***мас=нью **инт (к) ; **мас=нью *инт (о) ; *мас=нью инт (а) ;

Ссылка на основную публикацию
Топ лучших видеокарт для игр
Видеокарты крайне быстро улучшаются, практически каждые полгода выходит видеоадаптер, значительно превосходящий предшественника. Активный прогресс обусловлен быстрым увеличением системных требований компьютерных...
Телефон леново включается но не запускается
Бывает, что пользователь включает свой смартфон, процесс доходит до заставки (логотипа) и дальше не грузится. Сразу начинается паника, ведь телефон...
Телефон леново инструкция для чайников
Большинство из нас чувствует себя неуверенно, когда приходится знакомиться с новой операционной системой. И несмотря на то, что Андроид сегодня...
Топ приложений для запоминания слов
Топ-8 приложений, где запоминать английские слова Приложения для изучения английских слов помогают быстро и эффективно пополнять словарный запас. Без работы...
Adblock detector