Dynamiczna alokacja tablicy dwuwymiarowej

0

Witam mam problem z dynamiczną alokacją tablicy dwuwymiarowej.
Chciałbym, żeby wyglądała ona mniej więcej tak:
tablica[z][n];
gdzie z to liczba zestawów liczb która ja podaje a n ilość liczb w podanym zestawie.


int main()
{ int z,n;
  int **tab=NULL;

		cin>>z;   
		cin>>n; 
		
	tab=new int *[z];
	tab[z]=new int[n];

        tab[z][n];


}
 

Stąd moje pytanie czy może być to zrobione w taki sposób ?

2

Prawie może być z dokładością do:

for(int i = 0; i < z; ++i)
  tab[i]=new int[n];

Oczywiście później trzeba odpowiednio zwolnić pamięć.
Moźna też użyć std::vector

ale polecam zanim zadasz kolejne pytanie na temat podstaw lekturę:
Takie małe FAQ

2
tab = new int* [z];
for (int i = 0; i < z; ++i)
    tab[i] = new int[n];
tab[z][n];

Co to ma robić? I pamiętaj, indeks idzie od 0, czyli nie ma takiego elementu. "Maksymalny" to tab[z-1][n-1].

0

Zapomniałem tego dodać w komentarz chciałem sobie napisać, że w tym miejscu mam już tablice

//tab[z][n]

Co do fragmentu tego:

for (int i = 0; i < z; ++i)

Nie lepiej to zmienić na:

for (int i = 0; i <=z; ++i)

i wtedy problem z maksymalna tablica tab[z-1][n-1] znika ?

mam teraz jeszcze jedno pytanie odnośnie wpisywania wartości do tej tablicy można to robić za pomocą tej pętli ?

	for(int i=0;i<=z;i++)
	{
		for(int l=0;l<=n;n++)
			cin>>tab[i][l];
	}

Dzięki Wielkie za pomoc!

dodanie znaczników <code class="cpp"> - @furious programming

1
pargizon napisał(a):
tab = new int* [z];

Co do fragmentu tego:

for (int i = 0; i < z; ++i)
   

Nie lepiej to zmienić na:

for (int i = 0; i <=z; ++i)
 

i wtedy problem z maksymalna tablica tab[z-1][n-1] znika ?

Nie znika ani ten problem, a pojawia się problem dodatkowy - mazania po pamięci. Skoro alokujesz na z elementów tablicę, to masz tam elementy od 0 do z-1.

mam teraz jeszcze jedno pytanie odnośnie wpisywania wartości do tej tablicy można to robić za pomocą tej pętli ?

	for(int i=0;i<=z;i++)
	{
		for(int l=0;l<=n;n++)
			cin>>tab[i][l];
	}
 

z dokładnością do nierówności - inaczej program ma szanse wysypać się, a przynajmniej zamaże kawałek pamięci. czyli nie <=, tylko <

0

Okej dziękuje bardzo za pomoc ! W takim razie mogę dalej starać się coś pisać w tym programie. Jeśli będę miał jakieś trudności to będę pytał !:)

0

Nie chcąc dodawać nowego tematu kolejne pytanie zadam tutaj ponieważ jest ono połączone z dynamiczna alokacja tablicy ale tym razem jedno wymiarowej.

for(int i=0, j=0; i<n;++i)
	{	
		if(tab[i]>0 && tab[i]<n)
		{	
			dod[j]=tab[i];
			++j;
		}
	}
	

Podana tutaj część kodu ma wrzucać wartość z tablicy tab do tablicy dod gdy spełniony jest podany warunek. Zatem mam pytanie w jaki sposób mogę stworzyć tablice dod aby po wyjściu z pętli for miała ona tylko tyle elementów ile zostało tam zapisanych.

1

Podana tutaj część kodu ma wrzucać wartość z tablicy tab do tablicy dod gdy spełniony jest podany warunek. Zatem mam pytanie w jaki sposób mogę stworzyć tablice dod aby po wyjściu z pętli for miała ona tylko tyle elementów ile zostało tam zapisanych.</quote>

Albo dod musi być wielkości tab, albo być typu std::vector, std::deque, lub std::list - zalezy jak chcemu korzystać dalej z tego dod i wtedy:

dod.push_back(tab[i]]
0

Wystarczy chyba jak będzie wielkości n, ale później podczas wypisywania
np.

for(int i=0;i<n;++i)
	{	
		//if(abs(dod[i])>2000) break;
		cout<<dod[i]<<endl;
	} 

bez komentarza wypisuje kilka elementów które powinny być poprawne i później jakieś dziwne liczby, a po usunięciu komentarza wypisuje wszystko poprawnie ale ja muszę mieć tylko te wpisane elementy tam bez tych "dziwnych" liczb.

1

Bo musisz zwrócić informację ile elementów zostało wpisanych do dot, czyli ta zmienna j.

0

Właśnie w tym tkwi mój problem nie mam pojęcia w jaki najlepszy i najszybszy sposób mógłbym to zrobić. Bo chyba robienie drugiej tablicy która będzie brała wszystkie te wartości, licznika pętli ile tych wartości które chce otrzymać dodaje i wrzucenie później już poza pętlą do tej tablicy której wtedy bym dawał wielkość nie jest najlepszym rozwiązaniem.

1
pargizon napisał(a):

Właśnie w tym tkwi mój problem nie mam pojęcia w jaki najlepszy i najszybszy sposób mógłbym to zrobić. Bo chyba robienie drugiej tablicy która będzie brała wszystkie te wartości, licznika pętli ile tych wartości które chce otrzymać dodaje i wrzucenie później już poza pętlą do tej tablicy której wtedy bym dawał wielkość nie jest najlepszym rozwiązaniem.

Tak jak napisałem, albo alokujesz z naddatkiem, czyli wielkość tab (j zadeklaruj sobie poza pętlą, będziesz mieć informacje ile zostało dodanych do dod elementów), albo skorzystaj z podanych kontenerów - wtedy dynamicznie będzie ci się samo zwiększać.

0

Tylko nie mam pojęcia jak z tych "podanych kontenerów" skorzystać w tym przypadku.

1

Najprostszy:

std::vector<int> dod;
...
dod.push_back(tab[i]);//wstawiamy spelniajace warunek
...

wypisywać możemy na kilka sposobow, najlepszy byłby sposób z wykorzystaniem iteratorów, ale żeby nie wprowadzać zbyt wielu nowości na raz, to na początek znany sposób, czyli potraktuj dod jak tablice, a jego wielkosc (ilosc elementów możesz pobrac za pomoca dod.size();)

0

Dziękuje bardzo za pomoc ! Poczytam jeszcze trochę o tym i postaram się użyć .

1 użytkowników online, w tym zalogowanych: 0, gości: 1