Zwracanie tablicy wielowymiarowej z funkcji

0

Dobry wieczór Panowie kto pomoże?

template <size_t size_x, size_t size_y>
void inverse(float(&arr)[size_x][size_y])
{
  return arr;
}

int main(){
	
       float matrix2[][2] =
	{
		{2, 2},
		{3, 4}
	};

    float matrix[][2] = inverse(matrix2);
}

i teraz moje pytanie jest takie: Co wstawić w miejsce void aby funkcja poprawnie zwracała tablicę, to będzie macierz, wiec tablica dwuwymiarowa.

3

std::array, zwrócenie C-tablicy jest właściwie nie możliwe bez pomocniczych klas.

2

Jeżeli Zaalokujesz tablicę dynamicznie w funkcji, to Możesz ją zwrócić jako wskażnik do wskażnika na float:

float ** f(float matrix[0][3]){
    float ** out;
    /* allokacja dynamiczna *
    float ** out = ...     */
    return out;
}

Gdybyś miał stałe rozmiary macierzy, to Możesz tez użyć struktury (z macierzą w środku), jako typu zwracanego.

0

Rozwiązanie używające std::array jest o tyle dobre, że wtedy Twoja funkcja może dostać specyfikator constexpr i będziesz mógł ją użyć w miejscach gdzie oczekuje się wyrażeń stałych.

1

mimo, że użyłeś słowa kluczowego template ten kod to jest C a nie C++.
Jeśli rozmiar macierzy jest znany w czasie kompilacji to std::array<std::array<float, N>, M> może być ok (tka jak napisał kq).
Jednak nawet w tym wypadku, lepiej jednak napisać klasę reprezentującą macierz, bo kod używający klasy bardzo się uprości i będzie czytelniejszy.

0

Owszem, jesteś w stanie zwrócić, ale jak koledzy pisali (ogólnie) sukces będzie miał krótkie nogi. Co ty z tym zrobisz to zależy od Ciebie. Ogólnie old-tablice (old od C), łatwo degradują się do wskaźnika i "tracą informację o wymiarach".

#include <iostream>

template <size_t size_x, size_t size_y>
auto inverse(float(&arr)[size_x][size_y]) -> decltype(arr)
{
    return arr;
}
 
int main(){
 
    float matrix2[][2]{
        {2, 2},
        {3, 4}
    };
 
    auto matrix = inverse(matrix2);
}

W C++ unikaj surowych tablic wielowymiarowych. W C jesteś zmuszony więc jest znanych wiele sposobów na ich obsługę i żaden nie jest idealny i powinien spełniać pewne założenia.
Naprawdę nie możesz użyć std::vector lub std::array albo tablicy wielowymiarowej zamapowanej na ciągłą przestrzeń pamięci?
W tym ostatnim przypadku przekazujesz tylko wskaźnik i dwa wymiary a naliczenie adresu następuje przy dostępie.

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