wielowymiarowe tablice statyczne i dynamiczne

0

Mam takie pytanie odnosnie c++.
DLaczego takie dzialanie nie jest poprawne:

void funkcja(int** x)
{
x[0][0]=2;
}

int tablica[2][2];

funkcja(tablica);

Jeśli chodzi o dynamiczne tablice wielowymiarowe to wszystko działa jak należny, a ze statycznymi nie. jest możliwe korzystanie z wielowymiarowych tablic statycznych po przesłaniu do funkcji w taki sposób, ze się odwołujemy poprzez [][], a nie w taki sposób jak poniżej?

funkcja(int *x)
{
x[1] =3; // czyli tablica[0][1]?
}

funkcja(tablica[0])
0

Ad1
Jest niepoprawne bo co to niby jest
tab** x
?
x jest wskaźnikiem do wskaźnika na tab, a czym jest tab? o_O

Ad2
Tablica NIE JEST WSKAŹNIKIEM. Możesz ją zrzutować do wskaźnika, to fakt, ale to nie jest to samo. Zresztą nie bardzo widzę sens takich kombinacji.

0

W pierwszym sie machnąłem. Już poprawiłem - miało być tam int zamiast tab.
To w takim razie jak przesyłać wielowymiarowe tablice statyczne do funkcji?

1

Ok więc już wyjaśniam czemu tak sie nie da zrobić. Bo komputer nie jest wszechwiedzący. Skąd komputer miałby wiedzieć ile wierszy i kolumn ma twoja tablica jak zrzutujesz ją na int**?
Pomyśl... Komputer tworzy tablice w taki sposób:
w pamięci tablica tab[2][2] ma komórki ulokowane tak: (0,0)(0,1)(0,2)(1,0)(1,1)(1,2)(2,0)(2,1)(2,2)
Dzięki temu jak robisz tab[X][Y] to komputer wie dokładnie w jakim miejscu w pamięci to jest bo to jest zawsze: tab+(X*ilosc_kolumn+Y)sizeof(typ)
Podkreślam: konieczna jest wiedza na temat ilości kolumn!
Jak rzutujesz to sobie na int
* to ta informacja jest bezpowrotnie gubiona i wtedy odwołanie się do tab[X][Y] traci sens.

Oczywiście mozesz zapytać "no ale przecież są tablice dynamiczne i to działa!". Ale proponuje zauważyć ze nie istnieją wielowymiarowe tablice dynamiczne. To są tylko tablice wskaźników do tablic jednowymiarowych (ew po drodze jest więcej tych tablic wskaźników, ale zawsze masz tablicę jednowymiarowe!). Dzięki temu problemu nie ma, bo dla komputera każde [X] jest po prostu dereferencją tab+X*sizeof(typ) i żadna wiedza na temat wymiarów tablicy nie jest potrzebna.

0

Dobrze, to jak w takim razie przesyłać te nieszczęsne tablice do funkcji? jakbyś mógł podać przykład z tablicami dwu i trzywymiarowymi.

0

jest szczególnie fajnie jak wywalają twoje komentarze, SUPER

0

A co z moim problemem?:D

0

Podbijam. Bardzo mnie ten problem irytuje, dlatego czy mógłby ktoś zaprezentować przykładowe przekazanie tablicy dwu i trzy elementowej do funkcji?

1
void foo1(int tab[2][2])
{
    tab[0][0] = 0;
}
void foo2(int tab[][2])
{
    tab[0][0] = 0;
}
void foo3(int *tab)
{
    for(int i = 0; i < 2; i++)
        for(int j = 0; j < 2; j++)
            *(x + i*2 + j) = 10*i + j;
}
int a[2][2];
foo1(a);
foo2(a);
foo3((int*)a);
0

Dziękuje. Tak dla jasności, to zamiast x powinno być tab?

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