• 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

VPS Starter Arubacloud
0 głosów
562 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 915 wizyt
pytanie zadane 15 marca 2020 w Programowanie przez Daaa22 Dyskutant (8,250 p.)
0 głosów
2 odpowiedzi 358 wizyt
+1 głos
1 odpowiedź 526 wizyt
pytanie zadane 29 października 2017 w C i C++ przez chucksqll Stary wyjadacz (12,930 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...