• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przekazywanie tablicy dwuwymiarowej do funkcji z użyciem referencji.

Object Storage Arubacloud
0 głosów
9,297 wizyt
pytanie zadane 17 lutego 2016 w C i C++ przez Munvik Dyskutant (9,350 p.)

Witam.mam problem z przekazaniem tablicy dwuwymiarowej jako argument przez referencję.

Zawsze to robiłem za pomocą & i działało jak należy.

No domyślam się, że na tablicach robi się to inaczej dlatego pytam o zdanie tych którzy wiedzą to czego potrzebuje.

 

Mam  char plansza[20][40]

 

2 odpowiedzi

+2 głosów
odpowiedź 17 lutego 2016 przez niezalogowany
Poco przekazywać tablicę przez referencje? Gdy przekazujesz tablicę do funkcji zawsze pracujesz na orginale.
komentarz 17 lutego 2016 przez Munvik Dyskutant (9,350 p.)
Tego właśnie chcę dokonać
1
komentarz 17 lutego 2016 przez niezalogowany

Ale czego? Chcesz przekazać tablicę:

void func(int **tab)
{
//ciało funkcji
}
//lub
void func1(int tab[][2])//w tym przypadku kompilator musi znać rozmiar 2 wymiaru
int main()
{
int tab[2][2];
func(tab)
func1(tab);

 

komentarz 17 lutego 2016 przez Munvik Dyskutant (9,350 p.)
Chodziło mi właśnie o tą pierwszą wersję funkcji ze wskaźnikami, dzięki
+1 głos
odpowiedź 17 lutego 2016 przez adambalski1 Obywatel (1,010 p.)
void funkcja(char &plansza){...}

int main()

{

char plansza[20][40];

funckcja(plansza);

return 0;

}

"Nazwa tablicy to jednocześnie adres jej zerowego elementu."

char tablica[2][2]; to by działało tak [0][0] później [0][1], [1][0], [1][1]

Oczywiście używamy inkrementacji wskaźnika więcej w odcinku pana Mirosława Zelenta o wskaźnikach.

Pozdrawiam
komentarz 17 lutego 2016 przez Munvik Dyskutant (9,350 p.)
Dzięki, wróce do odcinka, trafna sugestia :D
komentarz 17 lutego 2016 przez draghan VIP (106,230 p.)
@adambalski1 - jesteś pewien, że wiesz o czym piszesz? :P
komentarz 18 lutego 2016 przez adambalski1 Obywatel (1,010 p.)
Podaje adres 1-szej komórki tablicy(np. [0][0], [0][1], [1][0], [1][1]).A, żeby dojść do następnych komórek inkrementuje adres poprzez dodanie odpowiedniej liczby bajtów w zależności od prymitywnego bądź złożonego typu(klasy).

Pozdrawiam :)
komentarz 18 lutego 2016 przez draghan VIP (106,230 p.)

Dla tablic jednowymiarowych to się sprawdza bardzo ładnie, jednak dla dwóch i więcej wymiarów to trochę bardziej skomplikowane.

W zależności, czy definiujesz swoją tablicę jako statyczną, czy dynamiczną - inaczej musisz potraktować typ argumentu formalnego. Dla statycznych musisz podać obowiązkowo wszystkie wymiary, prócz pierwszego. Dla dynamicznych - nazwa tablicy jest rzeczywiście wskaźnikiem na zerowy element, ale typ owej tablicy to nie jest np. char *, tylko char **, jako że tablica ma więcej niż jeden wymiar.

void f_tab_1d_stat(char arg[]){}

void f_tab_1d_dyn(char *arg){}

void f_tab_2d_stat(char arg[][3]){}

void f_tab_2d_dyn(char **arg){}

int main()
{
    char tab_1d_stat[30], *tab_1d_dyn;
    char tab_2d_stat[2][3], **tab_2d_dyn;
    tab_1d_dyn = new char[15];

    tab_2d_dyn = new char*[15];
    for(unsigned i = 0; i < 15; ++i)
        tab_2d_dyn[i] = new char[3];

    // dla jednowymiarowej tablicy nie ma znaczenia, czy tablica jest dynamiczna czy statyczna
    f_tab_1d_stat(tab_1d_stat);
    f_tab_1d_stat(tab_1d_dyn);

    f_tab_1d_dyn(tab_1d_stat);
    f_tab_1d_dyn(tab_1d_dyn);

    // ale dla liczby wymiarów > 1 już ma...
    f_tab_2d_dyn(tab_2d_dyn);
    f_tab_2d_stat(tab_2d_stat);

    // błąd kompilacji:
    //f_tab_2d_dyn(tab_2d_stat);
    //f_tab_2d_stat(tab_2d_dyn);

    delete[] tab_1d_dyn;
    for(unsigned i = 0; i < 15; ++i) delete[] tab_2d_dyn[i];
    delete[] tab_2d_dyn;
    return 0;
}

 

Podobne pytania

0 głosów
2 odpowiedzi 190 wizyt
pytanie zadane 20 listopada 2016 w C i C++ przez ka-karola Początkujący (290 p.)
0 głosów
1 odpowiedź 591 wizyt
pytanie zadane 25 stycznia 2017 w C i C++ przez Bartłomiej Kalka Początkujący (280 p.)
0 głosów
1 odpowiedź 345 wizyt

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...