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

Dwuwymiarowa tablica wskaźników - zwracanie oraz przekazywanie do funkcji.

Object Storage Arubacloud
0 głosów
1,435 wizyt
pytanie zadane 17 czerwca 2017 w C i C++ przez sofnir Gaduła (4,690 p.)
otagowane ponownie 17 czerwca 2017 przez sofnir
Hej, tak jak w temacie, załóżmy, że wewnątrz klasy mam dwuwymiarową tablicę wskaźników int *tab[2][2]. Posiadam również drugą klasę, która ma metodę, korzystającą z tej tablicy. W jaki sposób napisać metodę, do której będzie ta tablica przekazywana oraz w jaki sposób napisać metodę, która zwróci tą tablicę z pierwszej klasy? Ja po wielu próbach się poddałem i użyłem obiektu klasy vector, ale chciałbym wiedzieć jak to zrobić w tradycyjny sposób.

1 odpowiedź

0 głosów
odpowiedź 17 czerwca 2017 przez Knayder Nałogowiec (37,640 p.)
wybrane 18 czerwca 2017 przez sofnir
 
Najlepsza

Jako argument funkcji, wysyłanie takiej tablicy jest proste:
 

void func(int *tab[6][6]) {
	*(tab[0][0]) = 1234;
}

Problem pojawia się ze zwracaniem. Żeby to zrobić, musisz ją dynamicznie alokować, co wiąże się z późniejszym usuwaniem jej, o czym także można zapomnieć. Generalnie jest to skomplikowane. Lepiej już tutaj użyć tego wektora.

Napisałem funkcje zwracającą taką tablicę. Nie jestem pewny czy zrobiłem to dobrze, ale może ci to zobrazować jakie to zawiłe:
 


int ***returnFilledArray() {
	int ***tab = new int**[6];
	for (int i = 0; i < 6; i++) {
		(tab[i]) = new int*[6];
		for (int x = 0; x < 6; x++)
			*(tab[x]) = new int;
	}

	for (int y = 0; y < 6; y++)
		for (int x = 0; x < 6; x++)
			*(tab[y][x]) = y * 6 + x;
	return tab;
}

 

komentarz 18 czerwca 2017 przez sofnir Gaduła (4,690 p.)
Bóg zapłać, już chyba rozumiem o co chodzi. To wynika z tego, że tablica dwuwymiarowa jest w pamięci komputera reprezentowana w jednym szeregu bajtów i jak zwracamy tylko wskaźnik, to kompilator nie ma informacji, co jaką liczbę bajtów zaczyna się już nowy wiersz tablicy. W przypadku tablicy jednowymiarowej to działa, bo typ zmiennej np. int zakłada nam o ile bajtów mamy się przesuwać. Nie wiem czy dobrze to rozumiem.

Dodatkowo, pozwól, że dopytam new int **[6] oznacza, że tablica dwuwymiarowa wskaźników ma w każdym wierszu 6 elementów (6 kolumn), a nie 6 wierszy?

Czy stosowanie tych wektorów nie jest mniej wydajne, czy nie zajmują więcej pamięci itd.?
komentarz 18 czerwca 2017 przez Knayder Nałogowiec (37,640 p.)
https://stackoverflow.com/questions/3664272/is-stdvector-so-much-slower-than-plain-arrays
Jeżeli chodzi o pamięć, to raczej nie ma sensu że zajmuje więcej miejsca :D

Podobne pytania

+1 głos
1 odpowiedź 1,663 wizyt
pytanie zadane 24 lutego 2018 w C i C++ przez Sic Dyskutant (8,510 p.)
0 głosów
3 odpowiedzi 705 wizyt

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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!

...