Możenie macierzy za pomocą tablic dynamicznych - Access violation writing location 0xFDFDFDFD.

0

Witam,

Pisze program, który pomnoży 2 macierze o zadanych przez użytkownika wymiarach.
Program wysypuje się na etapie podawania wartości elementów macierzy.
Podejrzewam, ze gdzieś pomyliłem szerokość z długością macierzy, ale nie mogę znaleźć błędu.
Ktoś pomoże ?

ps. Przy macierzy kwadratowej program działa.

 
```// macierze_mnozenie_dzielenie.cpp -- program do mnozenia i dzielenia macierzy

#include <iostream>

int main()
{
	using namespace std;
	int col;
	int row;
	cout << "Progrma do monozenia i dzielenia macierzy.\n\n";
	cout << "Mnozyc mozna tylko macierz o rozmiarze Y na X przez macierz X na Y\n\n";
	cout << "Podaj ilosc poziomych wierszy w I macierzy: ";
	cin >> col;
	cin.get();
	cout << "Podaj ilosc pionowych kolumn w I macierzy: ";
	cin >> row;
	cin.get();

	int ** macierzA = new int *[col];
	for (int i = 0; i < col; i++)
	{
		macierzA[i] = new int[row];
	}
	cout << "utworzylem macierz A (wymiar X na Y)\n\n";

	int ** macierzB = new int *[row];
	for (int j = 0; j < col; j++)
	{
		macierzB[j] = new int[col];
	}
	cout << "utworzylem macierz B (wymiar Y na X)\n\n";

	int ** macierzC = new int *[row];
	for (int k = 0; k < row; k++)
	{
		macierzC[k] = new int[row];
	}
	cout << "utworzylem macierz C (wymiar Y na Y)\n\n";

	cout << "Czas podac el. I macierzy" << endl << endl;
	for (int r = 0; r < row; r++)
	{
		for (int c = 0; c < col; c++)
		{
			cout << "Podaj element a" << r + 1 << c + 1 << ": ";
			cin >> macierzA[r][c];
			cin.get();
		}
	};
	cout << endl;

	cout << "Czas podac el. II macierzy" <<endl <<endl;
	for (int r = 0; r < col; r++)
	{
		for (int c = 0; c < row; c++)
		{
			cout << "Podaj element b" << r + 1 << c + 1 << ": ";
			cin >> macierzB[r][c];
			cin.get();
		}
	};
	cout << endl;

	cout << "Twoja macierz A wyglada nastepujaca:" << endl << endl;
	for (int r = 0; r < row; r++)
	{
		for (int c = 0; c < col; c++)
		{
			cout << "\t" << macierzA[r][c];
		}
	};
	cout << endl<<endl;

	cout << "Twoja macierz B wyglada nastepujaca:" << endl << endl;
	for (int r = 0; r < col; r++)
	{
		for (int c = 0; c < row; c++)
		{
			cout << "\t" << macierzB[r][c];
		}
		cout << endl;
	};
	cout << endl;
3

Użyj std::vector albo jakiegoś wrappera dla macierzy jak człowiek :/

    int ** macierzA = new int *[col];
    for (int i = 0; i < col; i++)
    {
        macierzA[i] = new int[row];
    }

macierzA wskazuje na col wskaźników na tablice o row elementów.

    for (int r = 0; r < row; r++)
    {
        for (int c = 0; c < col; c++)
        {
            cout << "Podaj element a" << r + 1 << c + 1 << ": ";
            cin >> macierzA[r][c];
            cin.get();
        }
    };

Dostęp do macierzA jest w sposób gdyby to był wskaźnik na row wskaźników po col elementów.

Na szybko napisałem prosty widok na macierz 2d:

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);
	}
};

przykładowe użycie:

int main()
{
	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";
	}
}

http://melpon.org/wandbox/permlink/Co0q2UMczABXVPgX

3

Program należy dzielić na funkcje.
Przykładowo (dla wersji bez vector):

int **UtworzMacierz(int kolumn, int wierszy);
void WczytajMacierz(int **m, int kolumn, int wierszy);

… … …
macierzB = UtworzMacierz(col1, row1);
cout << "utworzylem macierz A (wymiar X na Y)\n\n";
macierzB = UtworzMacierz(col2, col1);
cout << "utworzylem macierz B (wymiar Y na X)\n\n";
macierzC = UtworzMacierz(col2, row1);
cout << "utworzylem macierz C (wymiar Y na X)\n\n";
… … …

Zapobiegnie to robieniu głupich błędów jak mylenie wierszy i kolumn (stąd masz błąd).
Pochrzaniło ci się, bo liczba kolumn pierwszej macierzy jest równa liczbie wierszy drugiej macierzy, więc pętla for (int j = 0; j < col; j++) w jednym z tych przypadków jest bezsensu.

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