3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
1

Как создать трехмерный массив из одномерного?

14.06.2019, 22:18. Показов 1370. Ответов 9
Метки нет (Все метки)

Вот первый раз, наверное, за ~год столкнулся с тем, что мне нужен 3-х мерный массив. Создать я его решил, конечно же, динамическим, по типу того, как создавал 2-х мерный:
C++
1
2
3
4
5
int row = 5, col = 8;
char *_arr = new char[row*col];
char **arr = new char*[row];
for(int i = 0; i < row;i++)
     arr[i] = _arr + i * col;
Вот по такому же методу пытался создать 3-х мерный. Что-то вообще не получается... Путаюсь конкретно в том, откуда начинать, с какого измерения идти...В общем, сложно объяснить, что конкретно непонятно, хотелось бы увидеть просто пример кода - это как-то сложило бы всё в голове по полочкам
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2019, 22:18
Ответы с готовыми решениями:

Как создать трёхмерный массив?
Как вообще вводится трехмерный массив, если надо, чтобы значения задавались с клавиатуры, т.е. не...

Как создать большой трехмерный массив?
Доброго дня ! Как-то тут же на форуме я спрашивал про создание большого двумерного массива masA....

Как создать трехмерный массив, размерность которого задается с клавиатуры?
Visual Studio требует константы, и если я хочу вводить размерность с клавиатуры, то надо динамично...

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

9
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
15.06.2019, 04:02  [ТС] 2
Почему иногда выдает ошибку: Нарушение прав доступа?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int x = 6, y = 4, z = 2;
    char *__arr = new char[x*y*z]{0};
    char **_arr = new char*[y] {0};
    char ***arr = new char**[x*y]  {0};
 
    for (int i = 0; i < x*y*z; i++)__arr[i] = i;
 
    for (int i = 0; i < y; i++)_arr[i] = __arr + i * x * z;
 
    for (int i = 0; i < y; i++) {
        arr[i] = _arr + sizeof(arr) * i;
        for (int j = 0; j < x; j++)
            arr[i][j] = _arr[i] + z * j;
        cout << (int)arr[0][2][0] << endl;
        }
0
2753 / 1908 / 568
Регистрация: 05.06.2014
Сообщений: 5,559
15.06.2019, 05:16 3
Видимо, из-за неизвестно зачем нужного sizeof, который возвращает размер указателя, а не массива.
0
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
15.06.2019, 09:50  [ТС] 4
Renji, да, так и нужно. Т.к. Нужно его сдвигать относительно размера указателя. А ошибку выбивает в 14 строке
0
16079 / 8681 / 2120
Регистрация: 30.01.2014
Сообщений: 14,960
15.06.2019, 11:47 5
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
да, так и нужно.
Да нет, не нужно

Индексация одномерного массива на трехмерный производится по следующей формуле: (i * y + j) * z + k, где i, j и k - индексы размерностей x, y и z соответственно.
sizeof здесь не нужен.

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
struct CharArray3D
{
    int x, y, z;
    char * array;
    
    CharArray3D(int x, int y, int z)
        : x(x), y(y), z(z)
        , array(new char[x * y * z]{})
    { }
    ~CharArray3D() { delete[] array; }
    
    CharArray3D(CharArray3D const &) = delete;
    CharArray3D & operator=(CharArray3D const &) = delete;
    
    int xSize() const { return x; }
    int ySize() const { return y; }
    int zSize() const { return z; }
    
    char & operator()(int i, int j, int k)
    {
        return array[(i * ySize() + j) * zSize() + k];
    }
    char operator()(int i, int j, int k) const
    {
        return array[(i * ySize() + j) * zSize() + k];
    }    
};
 
int main()
{
    CharArray3D arr(6, 4, 2);
    
    for(int i = 0; i < arr.xSize(); ++i) {
        for(int j = 0; j < arr.ySize(); ++j) {
            for(int k = 0; k < arr.zSize(); ++k) {
                arr(i, j, k) = i + j + k;
                
                std::cout << (int)arr(i, j, k) << ' '; 
            }
            std::cout << '\n';
        }
        std::cout << '\n';
    }
}
https://rextester.com/IEE30415
3
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
15.06.2019, 12:44  [ТС] 6
DrOffset, спасибо большое за код, подчеркнул для себя несколько интересных деталей
Но вся проблема в том, что мне нужно работать конкретно не с реализованным "3д" массивом, а с приведенным через указатели.
Та и просто очень интересно, почему выдает ошибку о нарушении прав доступа, так и еще и во время вывода массива О_о, даже не во время создания, или еще чего-то, где накосячить возможность есть...а при выводе!
0
162 / 69 / 39
Регистрация: 28.05.2019
Сообщений: 239
15.06.2019, 12:59 7
C++
1
2
3
4
5
6
7
    char*** arr = new char**[n];
    for (int i = 0; i < n; ++i)
    {
        arr[i] = new char*[m];
        for (int j = 0; j < m; ++j)
            arr[i][j] = new char[k];
    }
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
15.06.2019, 13:41 8
Вам же уже в вашей предыдущей теме показывали как создать трех-мерный массив динамически и как можно считать индексы самому по формуле (i * y + j) * z + k. Впрочем дважды повторять не имеет смысла.
Нарушение прав доступа
Цитата Сообщение от elseecay Посмотреть сообщение
char*** arr = new char**[n];
Это не трех-мерный массив.
1
162 / 69 / 39
Регистрация: 28.05.2019
Сообщений: 239
15.06.2019, 15:00 9
Цитата Сообщение от Azazel-San Посмотреть сообщение
Это не трех-мерный массив.
А что?
0
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
15.06.2019, 15:14  [ТС] 10
Azazel-San, тему слили с этой и удалились ответы к той теме

Добавлено через 11 минут
elseecay, это ступенчатый(или зубчатый) массив
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2019, 15:14
Помогаю со студенческими работами здесь

Как создать трехмерный массив
Требуется создаться трехмерный массив. Пытался разными способами. Даёт ошибки ...

Как создать трехмерный массив?
$arraym = array ( 'Фрукты' =&gt; array('яблоко', 'банан', 'груша'), ...

Как создать трехмерный динамический массив
Здравствуйте передо мной стоит такая задача. Нужно создать 3х мерный динамический массив 3...

Как создать трехмерный неравновмерный массив
Создать трехмерный неравномерный массив следующего вида: основание - прямоугольный теругольник с...

Как создать трехмерный зубчатый массив?
Сделать трехмерный зубчастый массив. И если можно пример прямоугольного многомерного массива.

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru