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

question-closed Tablica wielowymiarowa jako argument funkcji

42 Warsaw Coding Academy
0 głosów
735 wizyt
pytanie zadane 15 grudnia 2018 w C i C++ przez niezalogowany
zamknięte 15 grudnia 2018
Witam

Jest jakiś sposób żeby utworzyć funkcję która za argument będzie przyjmować wskaźnik do tablicy wielowymiarowej (w moim przypadku dwu)? Dla jednowymiarowej tablicy bez problemu, ale nie mogę tego przełożyć na dwuwymiarową. Próbowałem różnych deklaracji i cały czas albo błąd, albo gdzieś wykracza poza zakres pamięci.
komentarz zamknięcia: Otrzymanie odpowiedzi

1 odpowiedź

0 głosów
odpowiedź 15 grudnia 2018 przez RafalS VIP (122,820 p.)
wybrane 15 grudnia 2018
 
Najlepsza

Tablica to nie wskaźnik i jest to jedno z miejsc gdzie mozna sie na tym przejechać.

Po pierwsze - nie byłoby problemu gdybyś tablice wielowymiarową zadeklarował dynamicznie:

	int n=10, m=15;
	int ** t2d = new int*[n];
	for (size_t i = 0; i < n; i++)	{
		t2d[i] = new int[m];
	}

A jeśli faktycznie chcesz przekazać tablice alokowaną statycznie:

int tab[10][15];

To typ argumentu musi być wskaźnikiem na tablice 15 elementową, który można zapisać tak:

void f(int tab[][15])

lub tak:

void f(int(*tab)[15]) 

Musisz deklarować zewnętrzny rozmiar tablicy, bo taka tablica w pamieci wygląda jak tablica 1d - elementy sa rozlozone w pamieci w sposob ciagly, a kompilator pilnuje, żeby odwołania [0][2] dobierały sie do odpowiedniego elementu w tablicy 1d:

int tab[2][3];
int    int    int      int      int    int
     tab[0]        |         tab[1]           

Dlatego nie da sie jej zrzutować na podwójny wskaźnik.

Jako ciekawostke w języku C można było zaalokować tablice 2d w ten sposob:

int(*t2d)[15] = malloc(sizeof(int) * 10 * 15);

i odwoływać się do niej normalnie dwoma parami nawiasow kwadratowych:

t2d[0][3] = 10;

EDIT: w C++ też można :D

int(*t2d)[3] = reinterpret_cast<int(*)[3]>(new int[2*3]);

ale to raczej jako ciekawostka, nie polecam :P

komentarz 15 grudnia 2018 przez niezalogowany
Język C, dynamiczna deklaracja odpada.

Właśnie zastanawiałem się czy można uniknąć w jakiś sposób podawania rozmiaru ostatniej warstwy tablicy. Trochę ogranicza, ale z drugiej strony kompilator chyba miałby problem ze zrozumieniem z jaką tablicą ma do czynienia.
komentarz 15 grudnia 2018 przez RafalS VIP (122,820 p.)
Czemu dynamiczna deklaracja odpada?
komentarz 15 grudnia 2018 przez niezalogowany

Na studiach używamy c99, jest w tym standardzie operator new?

komentarz 15 grudnia 2018 przez RafalS VIP (122,820 p.)

Generalnie jeśli potrzebujesz jedynie funkcjonalności tablicy 2d to możesz sobie ją zaalokować jako zwykłą tablice 1d i obliczać indeks w ten sposób:

cout<<tab[j + i*j]<<endl;

 

komentarz 15 grudnia 2018 przez RafalS VIP (122,820 p.)
edycja 15 grudnia 2018 przez RafalS

Nawet nie zauważyłem, że mówimy cały czas o C :P

Użyj zatem malloc do deklaracji tablicy 2d:

	int n = 2, m = 3;
	int **t = malloc(sizeof(int*)*n);
	for (size_t i = 0; i < n; i++)
	{
		t[i] = malloc(sizeof(int)*m);
	}

 

komentarz 15 grudnia 2018 przez niezalogowany
I to jest właśnie to co mi było potrzebne :D. Będę musiał się obeznać tylko trochę z tym bo z ręczną alokacją się jeszcze nie bawiłem :d.

Podobne pytania

0 głosów
3 odpowiedzi 1,310 wizyt
pytanie zadane 15 marca 2020 w Programowanie przez Daaa22 Dyskutant (8,250 p.)
0 głosów
2 odpowiedzi 466 wizyt
+1 głos
1 odpowiedź 709 wizyt
pytanie zadane 29 października 2017 w C i C++ przez chucksqll Stary wyjadacz (12,930 p.)

93,382 zapytań

142,382 odpowiedzi

322,540 komentarzy

62,738 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...