Przypisanie wkaźnika jednej macierzy do drugiej macierzy

0

Witam

Mam dwie dynamiczne tablice dwuwymiarowe:

int **a, **b, liczba_wierszy_a, liczba_kolumn_a, liczba_wierszy_b, liczba_kolumn_b;

a = new int *[liczba_wierszy_a];
for (int i =0 ; i< liczba_kolumn_a; i++)
	a[i] = new int [liczba_kolumn_a];

b = new int *[liczba_wierszy_b];
for (int i =0 ; i< liczba_kolumn_b; i++)
	b[i] = new int [liczba_kolumn_b];

Teraz chciałbym żeby wskaźnik 'a' wskazywał na tablice 'b', a to co było pod 'a' żeby było prawidłowo zwolnione.

0

Okej, teraz chyba skumalem:

int** tmp = a
a = b

for(int i=0;i<w_a;++i) delete[] tmp[i];
delete[] tmp
0

No dobra, a jak teraz zwolnić b ?

0

Przerzucam się na dół z odpowiedziami bo w komentarzach nie mogę wkleić kodu.

Chodzi mi mianowicie o przypadek:

int **a, **b, liczba_wierszy_a, liczba_kolumn_a, liczba_wierszy_b, liczba_kolumn_b;
 
a = new int *[liczba_wierszy_a];
for (int i =0 ; i< liczba_wierszy_a; i++)
        a[i] = new int [liczba_kolumn_a];
 
b = new int *[liczba_wierszy_b];
for (int i =0 ; i< liczba_wierszy_b; i++)
        b[i] = new int [liczba_kolumn_b];


for(int i = 0; i< liczba_wierszy_a; ++i) 
        delete[] a[i]; 
delete[] a;
a=b;

 

Czy tu wskaźnik a na pewno będzie wskazywać na tablice b ? Czy można zastosować taką konstrukcję ?

I drugie pytanie: jak pozbyć się wskaźnika b już po operacji przypisania wskaźnikowi a - adresu tablicy b ?

0

Tak?

int **a, liczba_wierszy_b, liczba_kolumn_b;
 
a = new int *[liczba_wierszy_b];
for (int i =0 ; i< liczba_wierszy_b; i++)
        b[i] = new int [liczba_kolumn_b];

Może powiedz po ludzku o co ci biega.

0

Dziękuje Panowie za Wasze zainteresowanie i pomoc ale chyba kompletnie się nie rozumiemy.

Może trochę więcej kodu rozjaśni sprawę. Mam klasę, taką jak poniżej i chciałbym skonstruować metodę tej klasy która zmieni zawartość tablicy a.

class Macierz
{

private:

	int **a, liczba_wierszy_a, liczba_kolumn_a;

public:

	Macierz()
	{
		liczba_wierszy_a = 5;
		liczba_kolumn_a = 5;
		a = new int *[liczba_wierszy_a];
		for (int i =0 ; i< liczba_wierszy_a; i++)
        		a[i] = new int [liczba_kolumn_a];
	}

	~Macierz()
	{
		for(int i = 0; i< liczba_wierszy_a; i++) 
        		delete[] a[i]; 
		delete[] a;
	}

	ustaw_nowy_rozmiar_i_zawartosc(int **b, int liczba_wierszy_b, int liczba_kolumn_b)
	{
		//potrzebuję żeby zawartość tablicy dwuwymiarowej b przypisać do tablicy a
	}

}

 

Rozmiar nowej tablicy może być np 3X30 albo 40X4 albo 100X100 alb0 2X2. Niestety konstruktor musi zostać taki jaki jest i mogę jedynie modyfikować metodę ustaw_nowy_rozmiar_i_zawartosc(int **b, int liczba_wierszy_b, int liczba_kolumn_b). Chodzi aby prawidłowo zaimplementować kod tej metody.

0

Nie zrozumienie polegalo glownie na tym, ze slowo "zawartosc" nijak nie pasuje do slowa "wskaznik".

void copy(int** b, int w, int h)
{
	for(int i = 0; i < this->liczba_wierszy; ++i)
		delete[] a[i];
	delete[] a;

	a = new int*[w];
	for(int i = 0; i < w; ++i)
	{
		a[i] = new int[h];
		memcpy(a[i], b[i], h*sizeof(int));
	}

	this->liczba_wierszy = w;
	this->liczba_kij_wie_czego_tam = h;
}

Tak to wyglada w najprostszej postaci. W zyciu bym czegos takiego nie umiescil w kodzie, dlaczego nie chcesz korzystac z dobrodziejstw C++?

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