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

Dynamiczne alokowanie tablic wielowymiarowych

VPS Starter Arubacloud
0 głosów
1,712 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ź 138 wizyt
pytanie zadane 17 listopada 2017 w C i C++ przez Dordonmegazordon Początkujący (350 p.)
0 głosów
1 odpowiedź 630 wizyt
0 głosów
1 odpowiedź 1,594 wizyt

93,018 zapytań

141,984 odpowiedzi

321,282 komentarzy

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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...