Transpozycja macierzy dynamicznej

0

Witam, mam następujący problem, próbuję transponować macierz na dynamicznie utworzonej tablicy dwuwymiarowej. Wywala mi access violation writing location. Nie mam pojęcia na czym polega problem, przejrzałam wszystkie fora i niestety nie znalazłam nic, co mogłoby mi pomóc. Poniżej wklejam kod. Z góry dziękuję za pomoc

#include<iostream>
using namespace std;
void transpozycja(int **tab, int wymiar_x, int wymiar_y);
int main()
{
       int wymiar1_x, wymiar1_y,
	cout << "Podaj ilosc wierszy i kolumn tablicy 1" << endl;
	cin >> wymiar1_x >> wymiar1_y;

	int ** tablica1 = new int *[wymiar1_x];
	for (int i = 0; i < wymiar1_x; i++)
	{
		tablica1[i] = new int[wymiar1_y];
		for (int j = 0; j < wymiar1_y; j++)
			tablica1[i][j] = i;
	}

       cout << "Transpozycja tablicy 1:\n";
       transpozycja(tablica1, wymiar1_x, wymiar1_y);

       system("pause");
}

void transpozycja(int **tab, int wymiar_x, int wymiar_y)
{
	int ** tablica5 = new int *[wymiar_x];
	for (int i = 0; i < wymiar_x; i++)
	{
		tablica5[i] = new int[wymiar_y];
		for (int j = 0; i<wymiar_y; j++)
			tablica5[j][i] = tab[i][j]; //***********************Błąd
	}

	for (int i = 0; i < wymiar_x; i++)
	{
		delete[] tablica5[i];
	}

	delete[] tablica5;
}

0
for (int j = 0; i<wymiar_y; j++)

Zapewne chodzi o to, że masz i zamiast j w warunku. Ale swoją drogą, dość źle do całego zagadnienia podchodzisz. Używanie nagiego new i delete to nie jest zbyt szczęśliwy pomysł w C++ - masz smart pointery, masz kontenery. Tutaj przydałby się std::vector. Szerzej opisałem to tutaj.

Dodatkowo, prawie zawsze lepszym pomysłem będzie użycie tablicy jednowymiarowej i stworzenie sobie 2-wymiarowego widoku na nią, np:

template<typename T>
class simple_2d_matrix_view
{
	T* data_;
	size_t width_;
	size_t height_;
 
public:
 
	simple_2d_matrix_view(T* ptr, size_t h, size_t w):
		data_{ptr},
		width_{w},
		height_{h}
	{}
 
	size_t width() const { return width_; }
	size_t height() const { return height_; }
 
	T& operator()(size_t h, size_t w) {
		assert(w < width_);
		assert(h < height_);
		return data_[width_ * h + w];
	}
 
	T const& operator()(size_t h, size_t w) const {
		return const_cast<simple_2d_matrix_view&>(*this)(h, w);
	}
};

oraz przykład użycia:

vector<double> data{1,2,3,4,5,6,7,8,9,10,11,12};
 
simple_2d_matrix_view<double> m(data.data(), 2, 6);
 
for(size_t i = 0; i < m.height(); ++i) {
	for(size_t j = 0; j < m.width(); ++j) {
		cout << m(i, j) << " ";
	}
	cout << "\n";
}

link. (minimalnie szerzej opisałem to tutaj)

0

Haha rzeczywiscie!
Dziekuję Ci bardzo, tyle nad tym siedziałam i nie zauważyłam takiej literówki :> co do innych sposobów, to dopiero zaczęłam przerabiać klasy i nie jestem jeszcze z nimi tak obeznana jak bym chciała. Aczkolwiek zapoznam się z tym chętnie. Dziękuję jeszcze raz :)

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