[C++] Odbieranie tablicy wielowymiarowej jako wskaźnika


(Quentin) #1

Witam!

Potrzebuję napisać funkcję, która odbierze tablicę wielowymiarową. Wiem jak to się robi zarówno przy odbieraniu jako tablicy czy jako wskaźnika. Ale zobaczyłem przypadkiem, że w Symfonii C++ jest napisane:

Jak to nie - przecież jak mamy:

int tabl[4][8][10];funkcja(tabl); [/code]

To deklaracja tej funkcji musi wyglądać tak:

[code=php]void funkcja(int (*wsk)[8][10]); 


Tylko pierwszy wymiar nigdy nie jest zaszyty - reszta musi być przecież.

Czyli błąd w książce :?:

([alex]) #2

Chodzi o wywołanie:

int tab1[4][8][10];int tab2[10][8][4];void funkcja(int *wsk,unsigned Z,unsigned Y,unsigned X)  {   for(unsigned z=0;zZ;++z)      for(unsigned y=0;yY;++y)         for(unsigned x=0;xX;++x)             cout"tabl["z"]["y"]["x"]="*(wsk++)endl;  }funkcja((int*)tab1,4,8,10); // tylko w niektórych kompilatorach konieczna jest ta konwersjafunkcja(tab2,10,8,4); // większość przyjmie bezpośrednio [/code]

(Quentin) #3

Aha...

Ale minusem takiej konstrukcji będzie to że w funkcji nie będziemy mogli posługiwać się nawiasami kwadratowymi przy wskaźniku, tylko będziemy musieli sami przeprowadzać to liczenie adresu danego elementu (będziemy musieli pisać to, na co kompilator zamieni wyrażenie tablica[a][c]).


([alex]) #4

Podałem funkcję drukującą dowolną tablicę trójwymiarową czy widzisz gdzieś jakieś wyliczenia indeksu?

Czy martwi cie zapis: wsk[(z*Y+y)*X+x] ?

Ale dzięki temu zabiegowi masz funkcje która poprawnie zadziała dla dowolnej trójwymiarowej tablicy określonego typu.

Zawsze coś za coś i niczego za darmo :lol:


(Quentin) #5

No racja, zresztą jak ktoś już długo się zajmuje takimi tablicami, to obliczenia takie pisze z pamięci :wink: