Trójwymiarowa tabliczka mnożenia.

0

Witam.
Przerabiam rozdział z książki Alex Alain - Przewodnik dla początkujących C++. - Dynamiczna alokacja pamięci.
Zadanie :
*Napisz funkcję, która pobiera trzy argumenty -- długość, szerokość i wysokość, dynamicznie alokuje trójwymiarową tablicę utworzoną na podstawie tych wartości, po czym wypełnia ją tabliczkami mnożenia. Nie zapomnij o zwolnieniu pamięci po zakończeniu działania. *
Tak wyglądają moje starania.
Dostaję adresy zamiast wyników.
Jeszcze nie ustawiłem zwalniania pamięci.

Nie chcę gotowych rozwiązań. Raczej żeby ktoś mnie nakierował gdzie popełniam błąd i dlaczego.
Pozdrawiam.

#include <iostream>
using namespace std;

void trojWymiarowaTablica(int* w_w, int* w_s, int* w_d )
{// tworzenie 3d tablicy.
    int*** tablica = new int** [*w_w];
    for (int i = 0; i < *w_w; i++)
    {
        tablica[i] = new int*[*w_s];
        for (int j = 0; j < *w_s; j++)
        {
            tablica[i][j] = new int[*w_d];
        }
    }
    // tworzenie tabliczki mnozenia.
    for (int i = 0; i < *w_w; i++)
    {
        for (int j = 0; j < *w_s; j++)
        {
            int s = 0;
            s++;// skipuje 
                        {
            
            *tablica[i][j] = (i + 1) * (j + 1);
            for (int k = 0; k < *w_d; k++)
            {
                tablica[i][j][k] = *tablica[i][j];
            }
           
            cout << "[" << tablica[i][j] << "]";
            if (s == *w_s)
            {

                cout << " \n";
                s = 0;
            }

            }

        }
    }

}
int main()
{//     3   3   3
    int d, s, w;
    cout << "Podaj dlugosc, szerokosc, wysokosc; \n";
    cout << "Wysokosc : " << endl;
    cin >> w;
    
    cout << "Szerokosc : " << endl;
    cin >> s;
    
    cout << "Dlugosc  : " << endl;
    cin >> d;
    
    trojWymiarowaTablica(&w, &s, &d);
    
}
2
SpoconyJelen napisał(a):

Przerabiam rozdział z książki Alex Alain - Przewodnik dla początkujących C++. - Dynamiczna alokacja pamięci.
Zadanie :
*Napisz funkcję, która pobiera trzy argumenty -- długość, szerokość i wysokość, dynamicznie alokuje trójwymiarową tablicę utworzoną na podstawie tych wartości, po czym wypełnia ją tabliczkami mnożenia. Nie zapomnij o zwolnieniu pamięci po zakończeniu działania. *

Począwszy od C++11 zarządzanie pamięcią powinno być robione za pomocą wzorca RAII, więc żadnego ręcznego zwalniania pamięci nie powinno być.
Dlatego takie zadanie w książce wskazuje na to, że albo książka jest przestarzała, albo autor niegodny zaufania.

Najprościej skorzystać z std::vector:

// c++17:
auto m = std::vector{3, std::vector{3, std::vector(3, 0)}};
m[2][2][2] = 1;
// stare C++
std::vector<std::vector<std::vector<int> > > m(3, std::vector<std::vector<int> >(3, std::vector<int>(3)));
m[2][2][2] = 1;

i zarządzanie pamięcią masz rozwiązane.

2

Poniżej przykład jak alokować trzy wymiarową tablicę przy pomocy wskaźników.
Usuwanie przeprowadzane będzie w podobny sposób ( do samodzielnego zrobienia :) )

int*** allocate( int a , int b , int c )
{
    int*** tab {nullptr};

    tab = new int**[a];
    for( auto i=0 ; i<a ; ++i )
    {
        tab[i] = new int*[b];
        for( auto j=0 ; j<b ; ++j )
        {
            tab[i][j] = new int[c];
            for( auto k=0 ; k<c ; ++k ) tab[i][j][k] = (i+1)*(j+1)*(k+1);
        }
    }

    return tab;
}

Jednakże dzisiaj nie powinno się już używać się wskaźników do tworzenia dynamicznych tablic.
Zobacz jak powinno się to robić za pomocą kontenera vector.

vector<vector<vector<int>>> allocate( int a , int b , int c )
{
    vector<vector<vector<int>>> tab3D;

    tab3D.resize(a);
    for( auto& tab2D : tab3D )
    {
        tab2D.resize(b);
        for( auto& tab : tab2D )
        {
          tab.resize(c,10);
        }
    }

    return tab3D;
}

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