tablice dynamiczne z new w jaki sposób zrobić trick taki jak z malloc

0

czy jest jakaś metoda szybkiego tworzenia tablic wielowymiarowych dynamicznych z operatorem new , dlatego że do malloc jest w tym filmiiku na youtube pokazana metoda z tym że tym sposobem nie umiem tworzyć tablic dynamicznych new.
Metoda jest pokazana na 26 minucie tego filmu :

 
    double*** Tablica = new double**[N];
    for( int i = 0; i < N; ++i)
    {
      Tablica[i] = new double*[M];
      for( int j = 0; j < M; ++j)
      { 
         Tablica[i][j]= new double[L];
      }
    } 

czy w ten sposób jest dobrze ?
Jeśli tak to w jaki sposób dalej wypełniać tą tablicę?

 

 double*** Tablica2 = new double**[N+sizeof(double*)*N*M+sizeof(double)*N*M*L];
0

Jeśli tak to w jaki sposób dalej wypełniać tą tablicę?
Tak samo jak przy malloc…

0

w ten sposób mi działa dobrze:

 
    double*** Tablica = new double**[N+sizeof(double*)*N*M+sizeof(double)*N*M*L];
    double **tmp1;
    tmp1=(double**)&Tablica[N];
    double *tmp2;
    tmp2=(double*)&Tablica[N][M];//tmp2=(double*)&Tablica[N+N*M];??
    for( int i = 0; i < N; ++i) 
   {
      Tablica[i]=tmp1;
      tmp1=tmp1+M*L;
      for( int j = 0; j < M; ++j)
      {
          Tablica[i][j]=tmp2;
          tmp2=tmp2+L;
           } 
   }

z tym że zwolnienie pamięci można zrobić jedynie w ten sposób:


   for( int i = 0; i < N; ++i) 
  {
//       delete[] Tablica[i];
    }
    delete[] Tablica;

 
0

Co złego w tej de-alokacji?
Zamiast

double*** Tablica = new double**[N+sizeof(double*)*N*M+sizeof(double)*N*M*L]; 

nie powinno być czasem

double*** Tablica = new double**[N*M*L]

?

0

w ten sposób z pozoru działa mi dobrze. Czy ktoś by mógł sprawdzić czy ten algorytm jest dobry?

 

    //double*** Tablica = new double**[N*M*L];
    double*** Tablica = new double**[sizeof(double**)*N+sizeof(double*)*N*M+sizeof(double)*N*M*L];
    //double*** Tablica = new double**[N+sizeof(double*)*N*M+sizeof(double)*N*M*L];
    double **tmp1;
    tmp1=(double **)&Tablica[sizeof(double**)*N];
    double  *tmp2;
    //tmp2=(double *)&Tablica[M*N];
    tmp2=(double *)&Tablica[N+sizeof(double*)*N*M*L];
    for( int i = 0; i < N; ++i)
    {
      Tablica[i]=tmp1;
      tmp1=tmp1+L*N;

      for( int j = 0; j < M; ++j)
      {
          Tablica[i][j]=tmp2;
          tmp2=tmp2+L;     
      }
    }

    for(int i=0;i<N;i++)
    {cout<<"i= "<<i<<endl;
        for(int j=0;j<M;j++)
        {
            for(int k=0;k<L;k++)
            {           
                Tablica[i][j][k]=4;
                Tablica[i][j][k]=6;
        //        Tablica[i][j]=&tablica2[j*L+i*M*L];//budowa tablicy
                cout<<Tablica[i][j][k]<<" ";
            }cout<<endl;
        }cout<<endl;
    }cout<<endl;

   delete[] Tablica;

w ten sposób też działa:


    double*** Tablica = new double**[sizeof(double)*N*M*L];
    double **tmp1;
    tmp1=(double **)&Tablica[sizeof(double**)*N];
    double  *tmp2;
    tmp2=(double *)&Tablica[sizeof(double*)*N*M*L];
    for( int i = 0; i < N; ++i)
    {
      Tablica[i]=tmp1;
      tmp1=tmp1+M*L;

      for( int j = 0; j < M; ++j)
      {
          Tablica[i][j]=tmp2;
          tmp2=tmp2+L;     
      }
    }

    for(int i=0;i<N;i++)
    {
        cout<<"i1= "<<i<<endl;
        for(int j=0;j<M;j++)
        {
            for(int k=0;k<L;k++)
            {           
                Tablica[i][j][k]=4;
                Tablica[i][j][k]=6;
            //    Tablica[i][j]=&tablica2[j*L+i*M*L];//budowa tablicy
                cout<<Tablica[i][j][k]<<" ";
            }cout<<endl;
        }cout<<endl;
    }cout<<endl;

 
0
rewertyn napisał(a):

w ten sposób z pozoru działa mi dobrze...

rewertyn napisał(a):

w ten sposób też działa...
:
I w ten też ci działa:

    double d,*dd=&d,**ddd=&dd,*** Tablica=&ddd;
    for(int i=0;i<N;++i)
      {
       cout<<"i1= "<<i<<endl;
       for(int j=0;j<M;++j)
         {
           for(int k=0;k<L;++k)
              {
               Tablica[0][0][0]=6;
               cout<<Tablica[0][0][0]<<" ";
            }cout<<endl;
        }cout<<endl;
    }cout<<endl;
 

???

W pierwszym sposobie przydzielasz zdecydowanie za dużo pamięci.
W drugim za dużo lub za mało - zależy od konkretnych wartości: N,M,L

0

To, co próbujesz zrobić jest niezbyt mądre. Napisz sobie klasę, która będzie z zewnątrz wyglądać jak tablica której potrzebujesz, ale wewnątrz będzie używać zwykłej, jednowymiarowej tablicy alokowanej jednym new. Do dostępu do elementów przeciąż operator(). O tym jak przeliczać indeksy możesz dowiedzieć się z wiki: http://en.wikipedia.org/wiki/Row-major_order

Takie podejście ma swoje zalety: kod jest prostszy, łatwiej zarządzać pamięcią, locality "jest lepsze".

0

Można też nie wywarzać otwartych drzwi i użyć boost::multi_array

1 użytkowników online, w tym zalogowanych: 0, gości: 1