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

Dynamiczne alokowanie tablic wielowymiarowych

Object Storage Arubacloud
0 głosów
1,681 wizyt
pytanie zadane 4 sierpnia 2017 w C i C++ przez Darven Użytkownik (860 p.)

Witam, mam dwa problemy związane z tablicami.

W pierwszym przykładzie alokuje tablice dwuwymiarową wielkości 2x2. Następnie za pomocą pierwsz pętli chce ją zapisać (powiedzmy wartościami 5, jak w kodzie) a kolejną pętlą wypisać na ekranie.

int **tablica = new int *[2];

	tablica[0] = new int[2]; 
	tablica[1] = new int[2];


	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			**tablica = 5;
			tablica[i][j];
		}
		
	} 

	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			cout << tablica[i][j];
		}

	} 

No i problem jest taki, że nadaje wartość tylko pierwszej komórce, reszta nie działa. Czy zapis tablica[i][j] w pierwszej zagnieżdżonej jest niepoprawny??  Jeśli tak, to w jaki sposób mam się odwoływać do poszczególnych elementów wymiarów tablic?? Program kompiluje poprawnie, ale nie wiem jak przypisać wartości pozostałym komórkom.

 

Drugi problem jest z usuwaniem tablicy. Piszę w visual studio C++ i mam problem.

Taki kod jest poprawny: 

int *tablica = new int[5];


delete[] tablica;

Natomiast gdy spróbuje wskazać na kolejny adres: 

int *tablica = new int[5];

tablica++;

delete[] tablica;

To, mimo ze program kompiluje sie poprawnie, wyskakuje informacja "Element ConsoleApplication1.exe wyzwolił punkt przerwania.: wystąpił wyjątek " Tutaj dam pełny screen bo nie rozumiem o co w ogóle chodzi Może ktoś mi wyjaśnić o co z tym chodzi?

1 odpowiedź

+1 głos
odpowiedź 4 sierpnia 2017 przez PoetaKodu Stary wyjadacz (10,990 p.)
wybrane 5 sierpnia 2017 przez Darven
 
Najlepsza
​​​​​**tablica = 5;
tablica[i][j];

Symbol 'tablica' to wskaźnik na pierwszy element pierwszego wiersza tej dwuwymiarowej tablicy. Kiedy w pętli zwiększasz i oraz j to nie ma to żadnego wpływu na symbol 'tablica'. Druga linijka nic nie robi bo po prostu odwołujesz się do i-tego wiersza j-tego elementu ale nic z nim nie robisz - to tak jakbyś napisał:

int abc = 10;
abc;

Druga linijka nic nie robi, a mogłaby bo właśnie tak odwołuje się do elementów tablicy: przez operator [].
W takim razie zamień te linijki na:

tablica[i][j] = 5;

Drugi problem:

int *tablica = new int[5];
 
tablica++;
 
delete[] tablica;

Po zwiększeniu symbolu 'tablica', który jest wskaźnikiem jego adres przesuwa się o jeden element do przodu. Teraz chcąc usunąć tablicę spod tego wskaźnika nie ma kompletnych danych - proces wie, że gdzieś pod adresem, który wcześniej miał w sobie zapisany wskaźnik 'tablica' jest zaalokowana tablica o 5 indeksach typu int. Potrafi ją poprawnie usunąć tylko jeśli wskażesz na początek tej tablicy - jeśli nie to proces nie będzie w stanie rozpoznać ile tych elementów jest i czy w ogóle nie próbujesz czegoś napsuć więc dostajesz wyjątek.

komentarz 5 sierpnia 2017 przez Darven Użytkownik (860 p.)

OK, wszystko działa :D 

 

Ale mam inny upierdliwy problem teraz którego wcale nie rozumiem...Otóż, gdy zwiększam rozmiary alokowanej pamięci, nie mogę przy pomocy pętli nadać im wartość bo wyskakuje błąd o naruszanie zasad podczas zapisu do pamięci. Nie ogarniam tego, chodzi o ten skrawek kodu:

 

	int **tablica = new int *[5];

	tablica[0] = new int[5]; 
	tablica[1] = new int[5];


	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			tablica[i][j] = 5;
		}
		
	} 

Przecież przydzieliłem mu 5 na starcie, a w pętli nie mogę nadal wyjść poza wartość 2. Nie rozumiem tego.

komentarz 5 sierpnia 2017 przez PoetaKodu Stary wyjadacz (10,990 p.)
tablica[0] = new int[5]; 
tablica[1] = new int[5];

A gdzie reszta?

komentarz 5 sierpnia 2017 przez Darven Użytkownik (860 p.)
Dobra, nie przemyślałem tego i za szybko zadałem to pytanie :D

Podobne pytania

0 głosów
1 odpowiedź 127 wizyt
pytanie zadane 17 listopada 2017 w C i C++ przez Dordonmegazordon Początkujący (350 p.)
0 głosów
1 odpowiedź 534 wizyt
0 głosów
1 odpowiedź 1,542 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!

...