Funkcja zwracająca tablicę dwuwymarową

0

Napisz funkcję, która dostaje jako argumenty dwuwymiarową prostokątną tablicę tablic tab1 o wymiarach n × m i elementach typu int oraz jej wymiary, i zwraca jako wartość wskaźnik do nowo utworzonej dwuwymiarowej tablicy tablic tab2 o wymiarach m × n zawierającej transponowaną macierz przechowywaną w tablicy tab1 (czyli dla dowolnych k i j zachodzi tab1[k][j] = tab2[j][k].

Wyżej jest mój problem i wymyśliłem do niego taki program. Po odpaleniu wypisuje się tylko pierwszy element tablicy poprawnie a reszta to losowe liczby, nie wiem czy dobrze zwracam wskaźnik do tablicy ani czy dobrze tworze nową i zapisuję nową tablicę którą wyświetlam w funkcji main. Nigdzie nie mogłem znaleźć rozwiązania i proszę o pomoc.

Dodam że sprawdzałem wypisywanie tej tablicy wewnątrz funkcji i działa poprawnie więc problem mam z samym zwracaniem i wyświetlaniem w mainie.

#include <iostream>

using namespace std;

int transponowanie(int **tab1, int k, int j)
{
	int** tab2;
	tab2 = new int* [j] {};
	for (int i = 0; i < j; i++)
	{
		tab2[i]= new int[k] {};
	}

	for (int i = 0; i < k; i++)
	{
		for (int l = 0; l < j; l++)
		{
			tab2[l][i] = tab1[i][l];
		}
	}

	return **tab2;
}

int main()
{
	int n, m;
	cout << "Podaj wymiary tablicy: ";
	cin >> n >> m;
	int** tab1;
	tab1 = new int* [n];
	for (int i = 0; i < n; i++)
	{
		tab1[i] = new int[m];
		for (int j = 0; j < m; j++)
		{
			cin >> tab1[i][j];
		}
	}

	int** tab2;
	tab2 = new int* [m];
	for (int i = 0; i < m; i++)
	{
		tab2[i] = new int [n];
	}

	**tab2 = transponowanie(tab1, n, m);

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cout << tab2[i][j] << " ";
		}
		cout << "\n";
	}
	

	return 0;
}
0

Prawdopodobnie roi się to od ostrzeżeń kompilatora.
Trudno coś powiedzieć, dopóki nie powiesz prawdy.

masz niespójną z zadaniem deklarację (głęboko niespójną), do której usiłujesz dostosować jej użycie, ale jest to bez sensu. To robi coś ZUPEŁNIE innego, niż ma robić.,

Nawet jak ją poprawisz, zwracanie w C++ tablic w stylu C to zbrodnia. Na przykład wyciek pamieci

1

Za dużo gwiazdek w losowych miejscach. Wersja poprawiona:

#include <iostream>

using namespace std;

int** transponowanie(int **tab1, int k, int j) {
    int** tab2 = new int* [j] {};
    for (int i = 0; i < j; i++) {
        tab2[i]= new int[k] {};
    }

    for (int i = 0; i < k; i++) {
        for (int l = 0; l < j; l++) {
            tab2[l][i] = tab1[i][l];
        }
    }

    return tab2;
}

int main() {
    int n, m;
    // cout << "Podaj wymiary tablicy: ";
    // cin >> n >> m;
    n = 2;
    m = 3;
    int** tab1 = new int* [n];
    for (int i = 0; i < n; i++) {
        tab1[i] = new int[m];
        for (int j = 0; j < m; j++) {
            // cin >> tab1[i][j];
            tab1[i][j] = i * m + j;
        }
    }

    int** tab2 = transponowanie(tab1, n, m);

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << tab1[i][j] << " ";
        }
        cout << "\n";
    }

    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cout << tab2[i][j] << " ";
        }
        cout << "\n";
    }

    return 0;
}
2
std::vector<std::vector<int>>

albo

std::array<std::array<int>>

Array ma sztywny rozmiar, vector zmienny
Albo aktywni w C++ podrzucą lepszy pomysł

2

Jak używasz losowych par zmiennych do iterowania dwu(lub więcej)wymiarowej tablicy to masz prawie 100% gwarancję że gdzieś się pomylisz.
Do podania rozmiarów polecam (rowSize,colSize)/(Y,X) dla indeksacji (r,c)/(y,x).

Patryk Cyran napisał(a):
...
	tab2 = new int* [j] {};
...
		tab2[i]= new int[k] {};
...

Po kiego ci zerowanie przydzielonych fragmentów, przecież za chwile je wypełniasz.

Przydzielasz tablicę tab2 w main() i w następnym wierszu nadpisujesz tym co zwraca transponowanie?

#include <iostream>
using namespace std;

int **Create2dTable(size_t Y,size_t X)
{
 	int **tb=new int*[Y];
 	for(size_t y=0;y<Y;++y) tb[y]=new int[X];
 	return tb;
}
void Free2dTable(int **tb,size_t Y)
{
 	for(size_t y=0;y<Y;++y) delete[] tb[y];
 	delete[] tb;
}
int **Transpose2dTable(int **tb,size_t Y,size_t X)
{
 	int **bt=Create2dTable(X,Y);
 	for(size_t y=0;y<Y;++y) for(size_t x=0;x<X;++x) bt[x][y]=tb[y][x];
 	return bt;
}
void Show2dTable(int **tb,size_t Y,size_t X)
{
 	for(size_t y=0;y<Y;++y,cout<<endl) for(size_t x=0;x<X;++x) cout<<tb[y][x]<<'\t';
}
void Input2dTable(int **tb,size_t Y,size_t X)
{
 	for(size_t y=0;y<Y;++y) for(size_t x=0;x<X;++x) cin>>tb[y][x];
}

int main()
{
 	int Y, X;
 	cout<<"Table sizes: ";
 	cin>>Y>>X;
 	cout<<"Input values:"<<endl;
 	int **tb1=Create2dTable(Y,X);
 	Input2dTable(tb1,Y,X);
 	int **tb2=Transpose2dTable(tb1,Y,X);
 	cout<<"Source:"<<endl;
 	Show2dTable(tb1,Y,X);
 	cout<<"Result:"<<endl;
 	Show2dTable(tb2,Y,X);
 	Free2dTable(tb1,Y);
 	Free2dTable(tb2,Y);
 	return 0;
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.