[C++] Wysyłanie tablicy wielowymiarowej do funkcji

0

Tu jest program który ma obrazować mój problem. A problem polega na tym jak przesłać tablicę wielowymiarową do funkcji przez wskaźnik? Dobrze by było też także dowiedzieć się jak zapisać odpowiednią deklarację takiej funkcji bo domyślam się że w moim przykładzie nieźle namieszałem.

#include <iostream>
void foo(int *[][2], int);

int main()
{
	int tablica[4][2] = {{3,5},{6,3},{3,4},{5,8}};
	foo(tablica, 8);
}

void foo(int *tab[][2], int rozmiar)
{
			// ciało funkcji które jeszcze nie powstało
}

Wiem że można to zrobić tak

#include <iostream>
void foo(int [][2], int );

int main()
{
	int tablica[4][2] = {{3,5},{6,3},{3,4},{5,8}};
	foo(tablica, 8);
}

void foo(int tab[][2], int rozmiar)
{
			// ciało funkcji które jeszcze nie powstało
}

Znaczy... nie wiem czy można ale przynajmniej się kompiluje. Tylko czy praca bez wskaźników nie wyśle całej tablicy do funkcji? Bo to by było nie fajne... Dodatkowo był problem z inicjalizacją tablicy gdyż w pewnej książce co pomniejszych nawiasów nie było. Potem zdaje się element tablicy oblicza się ze wzoru (i * ilość_kolumn) + j dla tablicy [i][j].

0
zdesperowany programista napisał(a)

Tylko czy praca bez wskaźników nie wyśle całej tablicy do funkcji?
Raczej nie. Ale jak już tak bardzo chcesz wskaźnik do tablicy:

int (*tab)[][2]
0

a dałbyś rade wpisać to w program i wysłać?

0

No wiesz, ty masz int[4][2], to jest zupełnie co innego niż int[][2], ten pierwszy jest tylko niejawnie konwertowalny do drugiego, ale wskaźniki do nich, jak do każdej pary dwóch różnych typów, są zupełnie różne. Przekaż jako

int arr[][2]

Wyjdzie na to samo - nie będzie kopiowania i pass-by-value.

0

Czyli jeżeli będę mieć dużo większą tablicę to nie będzie problemu że się przesyłają duże ilości danych(Że kopiuje się każdy element tablicy zamiast wysłać początek?). Bo Ja w tym momencie nie robię żadnego programu a po prostu robię ćwiczenia z książki no i chciałbym nie "zrobić" program żeby działał i tyle ale także wyciągnąć z tego maksymalną ilość nauki.

0
Fanael napisał(a)

nie będzie kopiowania

0

Ok, dzięki za pomoc ;)

0

Podpowiem, że najłatwiej i bez pomyłek jest zdefiniować tablicę przez typedef np.:
typedef int Tablica[7][8][];
typedef *Tablica_ptr;
a później po prostu konsekwentnie tej nazwy używać. Np.:
Tablica_ptr przetwarzanie(Tablica wejsciowa)
{
//obrabianie tablicy wejściowej, z potencjalną zmianą jej danych
//...
return &wejsciowa;
}
W tym wypadku funkcja zwróci wskaźnik do tablicy będącej tym samym obiektem, co jej argument.
Taki sposób używania tablic jest o wiele bezpieczniejszy z punktu widzenia unikania błędów bo składnia używania tablic wielowymiarowych w C/C++ jest pod tym względem kryminogenna. :>

0
Olamagato napisał(a)

typedef *Tablica_ptr;
I co to niby ma zrobić?

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