Jak mogę przekazać do funkcji odwołanie do dwuwymiarowej tablicy?


Próbuję przekazać odniesienie do dwuwymiarowej tablicy do funkcji w C ++. Znam rozmiar obu pomiarów w czasie kompilacji. Oto, co mam teraz:
const int board_width = 80;
const int board_height = 80;
void do_something(int[board_width][board_height]& array);//function prototype

Ale to nie działa. Otrzymuję ten błąd z g ++:
error: expected ‘,’ or ‘...’ before ‘*’ token

Co oznacza ten błąd i jak mogę go naprawić?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli znasz rozmiar w czasie kompilacji, zrobi to:
//function prototype
void do_something(int (&array)[board_width][board_height]);

Zrób to z
void do_something(int array[board_width][board_height]);

W rzeczywistości zostanie przekazany wskaźnik do pierwszej pod-tablicy dwuwymiarowej tablicy („board_width” jest całkowicie ignorowany, jak w zdegenerowanym przypadku posiadania tylko jednego wymiaru, gdy masz
int array []
biorąc wskaźnik), co prawdopodobnie nie jest tym, czego chcesz (ponieważ wyraźnie poprosiłeś o link). Więc zrobienie tego z linkiem używającym sizeof dla parametru
sizeof array
da ci
sizeof (int [board_width] [board_height])
(tak jakbyś robił to ze sobą argument ), robiąc to drugą metodą (deklarując parametr jako tablicę, co zmusza kompilator do konwersji go na wskaźnik), otrzymujesz
sizeof (int (*) [board_height])
, a zatem , tylko rozmiar wskaźnika. [/code]
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Chociaż możesz przekazać odniesienie do tablicy, ponieważ tablice rozpadają się na wskaźniki w wywołaniach funkcji, gdy nie są one powiązane z parametrami odniesienia, i możesz używać wskaźników w taki sam sposób jak tablice, najczęściej tablice są używane w wywołaniach funkcji lubię to:
void ModifyArray( int arr[][80] );

lub odpowiednik
void ModifyArray( int (*arr)[80] );

Wewnątrz funkcji arr może być używany w taki sam sposób, jak gdyby deklaracja funkcji była:
void ModifyArray( int (&arr)[80][80] );

Jedynym przypadkiem, w którym to się nie powiedzie, jest sytuacja, w której wywoływana funkcja wymaga statycznie sprawdzonej gwarancji rozmiaru pierwszego indeksu tablicy.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz spróbować

cdecl

lub

c++decl

.
% c++decl
c++decl> declare i as reference to array 8 of array 12 of int
int (&i)[8][12]
c++decl> explain int (&i)[8][12]
declare i as reference to array 8 of array 12 of int
c++decl> exit
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Składnia jest nieprawidłowa.
Weźmy przykład tablicy 1D
int a[] = {1,2,3};
int (&p) [3] = a;// p is pointing array a

Możesz więc zrobić to samo dla macierzy 2D, jak pokazano poniżej
const int board_width = 80;
const int board_height = 80;
void do_something(int (&array) [board_width][board_height]);
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Myślę, że tego chcesz:
void do_something(int array[board_width][board_height]);

Nie można przekazać tablicy odwołań do funkcji.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się