Тема: Динамічний багатовимірний масив

1)Допоможіть створити динамічний багатовимірний масив та очистити його за допомогою delete (delete [] mas, не допоможе), коли я вписую 2,2,2 все робить а коли вписую якісь інші цифри наприклад 5,2,8 чи 6,8,8 програма не працює.

2)В такому записі int *p = new int; скільки буде виділено пам'яті для *р ?

#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
    int E1 , E2, E3, sk = 0;
    cin >> E1 >> E2 >> E3;

    int ***mas= new int**[E1];//динамічний масив 
    for (int i = 0; i <= E2; i++)
    {
        mas[i] = new int*;
        for (int j = 0; j <= E3; j++)
        {
            mas[i][j] = new int;
        }
    }

    for (int i = 0; i < E1; i++)//Цикли мають виводити i,j,l та рахувати елементи послідовно починаючи від 0
    {
        for (int j = 0; j < E2; j++)
        {
            for (int l = 0; l < E3; l++)
            {
                mas[i][j][l] = sk++;
                cout << "i = " << i << " j = " << j << " l = " << l << " mas = " << mas[i][j][l] << endl;
            }
        }
    }
    getch();
    return 0;
}

2

Re: Динамічний багатовимірний масив

Наведу робочий приклад.

#include <iostream>
#include <cstdlib>

using std::cout;
using std::endl;
using std::cin;

int main()
{
    int E1, E2, E3;
    
    cin >> E1 >> E2 >> E3;
    
    if (! (E1>0 && E2>0 && E3>0) )
    {
        cout << "Invalid dimensions!" << endl;
        return 1;
    }

    int ***arr = new int** [E1];
    
    for (int i = 0; i < E1; i++)
    {
        arr[i] = new int* [E2];
        
        for (int j = 0; j < E2; j++)
        {
            arr[i][j] = new int [E3];
            
            for (int k = 0; k < E3; k++)
                arr[i][j][k] = rand()%1000;
        }
    }
    
    for(int i = 0; i < E1; i++, cout << endl)
        for(int j = 0; j < E2; j++, cout << endl)
            for(int k = 0; k < E3; k++)
                cout << arr[i][j][k] << "\t";

    return 0;
}

3 Востаннє редагувалося yarko (02.07.2014 11:29:59)

Re: Динамічний багатовимірний масив

думаю краще використати вже готовий тип list з бібліотеки шаблонів STL
мороки менше...

наприклад масив у такому випадку треба описати
list<list<list<>int> > > mas;
і не треба піклуватися про знищення

Подякували: Betterthanyou1

4 Востаннє редагувалося koala (02.07.2014 12:14:06)

Re: Динамічний багатовимірний масив

0. Працюватиму з кодом від Bartash - сподіваюся, ви розумієте, чому.
1. Знищувати - точно так, як створювали, в зворотньому порядку:

for (int i = 0; i < E1; i++)
{
  for (int j = 0; j < E2; j++)
  {
    delete []arr[i][j];
  }
  delete []arr[i];
}
delete []arr;

2. Взагалі, знищувати краще в деструкторах, тому повністю погоджуюся з yarko стосовно STL; але все ж для імітації "звичайних" масивів краще не list, а vector (боляче не бити, це коротше, ніж цикли):

vector< vector< vector< int > > > vec(E1, vector< vector< int > > (E2, vector< int > (E3)));
Ну і

http://i.stack.imgur.com/kQnCS.png

Подякували: Betterthanyou2

5

Re: Динамічний багатовимірний масив

@koala
Дякую - забув про delete'и. :)

6

Re: Динамічний багатовимірний масив

Дякую за допомогу!
Я правильно зробив багатовимірний масив розмірністю 4 ?
Ніхто не відповів на моє друге запитання напевно я його неправильно сформував, коли я пишу, new int, і не вказую розмір масива в квадратних душках ( [ ] - квадратні душки ) який розмір цього масива.

#include <conio.h>
#include <iostream>
using namespace std;

int main()
{
    int e1, e2, e3, e4, ke=0;
    cin >> e1 >> e2 >> e3 >> e4;

    int ****mas = new int***[e1];
    for (int i = 0; i < e1; i++)
    {
        mas[i] = new int**[e2];
        for (int j = 0; j < e2; j++)
        {
            mas[i][j] = new int*[e3];
            for (int k = 0; k < e3; k++)
            {
                mas[i][j][k] = new int[e4];
            }
        }
    }

    for (int i = 0; i < e1; i++)
    {
        for (int j = 0; j < e2; j++)
        {
            for (int k = 0; k < e3; k++)
            {
                for (int l = 0; l < e4; l++)
                {
                    mas[i][j][k][l] = (ke++);
                    cout << "i = " << i << " j = " << j << " k = " << k << " l = " << l << " | mas = " << mas[i][j][k][l] << endl;
                }
            }
        }
    }

    for (int i = 0; i < e1; i++)
    {
        for (int j = 0; j < e2; j++)
        {
            for (int k = 0; k < e3; k++)
            {
                delete [] mas[i][j][k];
            }
            delete [] mas[i][j];
        }
        delete [] mas[i];
    }
    delete [] mas;

    getch();
    return 0;
}

7

Re: Динамічний багатовимірний масив

Коли ви пишете

new datatype;

виділяється місце на 1 змінну типу datatype, а не масив.

Подякували: Betterthanyou1