wielowymiarowe tablice statyczne i dynamiczne

wielowymiarowe tablice statyczne i dynamiczne
CC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0

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

Kopiuj
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?

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

funkcja(tablica[0])
Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
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.

CC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
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?

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
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.

CC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
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.

zbynio_k
  • Rejestracja: dni
  • Ostatnio: dni
0

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

CC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0

A co z moim problemem?:D

CC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0

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

byku_guzio
  • Rejestracja: dni
  • Ostatnio: dni
1
Kopiuj
void foo1(int tab[2][2])
{
    tab[0][0] = 0;
}
Kopiuj
void foo2(int tab[][2])
{
    tab[0][0] = 0;
}
Kopiuj
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;
}
Kopiuj
int a[2][2];
foo1(a);
foo2(a);
foo3((int*)a);
CC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.