kopiowanie dynamicznej tablicy dwuwymiarowej

0
 

void fun(int **w, int wiersz, int kolumna);
//int** copy(int **tab, int wiersz, int kolumna);
void jakis_algorytm(int **tab, int wiersz, int kolumna);

using namespace std;

int main()
{
    randomize();
    int dlugosc = 5, wysokosc = 5;
    int **tab = new int * [dlugosc]; // 1 tablica

    for (int i=0; i<dlugosc; i++)
    {
        tab[i] = new int[wysokosc];
    }

    fun(tab, dlugosc, wysokosc);

    for (int i= 0; i<dlugosc; i++)
    {
        delete []tab[i];
    }
     delete []tab;
}

void fun(int **w, int wiersz, int kolumna)
{
        for (int j=0; j<kolumna; j++)
        {
                for (int i=0; i<wiersz; i++)
                {
                        w[i][j] = random(2);
                        cout << w[i][j];
                }
                cout <<"\n";
        }
}

void jakis_algorytm(int **tab, int wiersz, int kolumna)
{
    int** kopia;
    // tu potrzebna kopia tablicy tab
}

Widać w kodzie mam za komentowana deklaracje funkcji .Nie wiem czy jest to dobra opcja...Chce po prostu skopiować z już wcześniej utworzonej tablicy elementy do drugiej tablicy.
Tylko że 1 tablica pojawi się chwile po rozpoczęciu programu (będzie dostepna dla danej klasy), druga potrzebna mi tylko do jednego algorytmu (który może się pojawić w programie n razy i za każdym razem trzeba nową tablicę) - ta będzie działać w obrębie tylko jeden funkcji).

Motam się jak to wszystko sprawnie zapisać. Mógł by ktoś naprowadzić ?

0

Zrobiłem tak

Był bym wdzięczny jeśli ktoś sprawdzi i napisze czy takie coś ma racje bytu i czy są jakieś błędy.
Pozdrawiam.

#include <iostream>
#include <vcl>

void fun(int **tab, int wiersz, int kolumna);
void copy(int **tab,int **w, int wiersz, int kolumna);
void jakis_algorytm(int **tab, int wiersz, int kolumna);

using namespace std;

int main()
{
    randomize();
    int dlugosc = 5, wysokosc = 5;

    int **tab = new int * [dlugosc];
    for (int i=0; i<dlugosc; i++)
    {
        tab[i] = new int[wysokosc];
    }

    fun(tab,dlugosc,wysokosc);
    jakis_algorytm(tab, dlugosc,wysokosc);

    for (int i= 0; i<dlugosc; i++)
    {
        delete []tab[i];
    }
    delete []tab;

    return 0;
}

// usupelnianie tablicy losowymi wartosciami i wyswietlenie
void fun(int **tab, int wiersz, int kolumna)
{
        for (int j=0; j<kolumna; j++)
        {
                for (int i=0; i<wiersz; i++)
                {
                        tab[i][j] = random(2);
                        cout << tab[i][j];
                }
                cout <<"\n";
        }
}

void copy(int **t,int **w, int wiersz, int kolumna)
{
    for (int j=0; j<kolumna; j++)
    {
        for (int i=0; i<wiersz; i++)
        {
            t[i][j] = w[i][j];
        }
    }
}

void jakis_algorytm(int **tab, int wiersz, int kolumna)
{
    int **tab2;
    tab2 = new int * [wiersz];
    for (int i=0; i<wiersz; i++)
    {
        tab2[i] = new int[kolumna];
    }

    // kopiowanie elementow z tab do tab2
    copy(tab2,tab,wiersz,kolumna);

    // ALGORYTM

    // usuwanie
    for (int i= 0; i<wiersz; i++)
    {
        delete []tab2[i];
    }
    delete []tab2;
}
0

int wiersz;
int kolumna;
spodziewasz się ujemnych wartości?
Jeżeli używasz C++ to czemu nie zrobisz obiektu?
Albo przynajmniej: struct TAB { int **Tb; unsigned rows,cols; }; ?

Jeżeli już musisz używać C z new/delete to może warto:

  • zrobić sobie dodatkowe funkcje:
    int **create(unsigned rows,unsigned cols);
    void delete(int **tb,unsigned rows);
  • przerobić:
    int **copy(int **tb,unsigned rows,unsigned cols);
  • podzielić fun na:
    void fill(int **tab,unsigned rows,unsigned cols);
    void show(int **tab,unsigned rows,unsigned cols,bool transpose=true);
0

To tylko testowy program w konsoli, normalnie będzie 'unsigned int'

Może i lepiej będzie wszystko w klasę wcisnąć...bo trochę bawienia się z tablicami będzie a i sam program nie jest mały. Aplikacja ma sprawdzać perkolacje dla x macierzy o rozmiarachn n x m. Do tego Wykres + GUI + graficzne wyświetlenie pojedynczej macierzy z początkowym i końcowym stanem komórek...

Lepiej do tego było by użyć dwu wymiarowego vektora ? czy już pozostać przy tablicach ? Dodam że algorytm może mieć dużą złożoność obliczeniową...

0

Na pewno lepiej opakować w klasę.
Opakowując w klasę nie musisz nawet tworzyć tablicy dwuwymiarowej.
int tb=new int[ColsRows];
tb[y*Cols+x]=... // wpisujemy w wiersz y, kolumnę x

0

Implementacja powyższego znalazła się niedawno w mojej wypowiedzi w innym wątku, obadaj klasę Board, jest to bardzo prosta klasa dynamicznie tworzonej tablicy 2D:
http://4programmers.net/Forum/C_i_C++/207527-problem_z_metoda_sprawdzajaca_skos_w_grze_logicznej?p=899229#id899229

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