[C++] Dynamiczna alokacja pamięci
Ostatnio zmodyfikowano 2013-11-15 16:39
Frish Temat założony przez niniejszego użytkownika |
[C++] Dynamiczna alokacja pamięci » 2013-11-15 12:33:06 Witam napisałem dwa kody i w tym pierwszym myślę że jest błąd(myślę że zmniejszenie rozmiaru kolejnej tablicy poprzez pętlę i dekrementacje "rozmiar_tablicy--;" powinno się odbywać tak jak w programie z drugiego kodu) ale proszę o potwierdzenie i jeżeli tak jest to dlaczego nie można w taki sposób ułożyć tego kodu ze sposobu pierwszego. #include <iostream>
int main() { int rozmiar_tablicy; int wartosc; std::cout << "Podaj wartosc: "; std::cin >> rozmiar_tablicy; std::cout << std::endl << "stworzono tablice zlozonej z " << rozmiar_tablicy << " elementow" << std::endl; int * liczba( 0 ); liczba = new int[ rozmiar_tablicy ]; do { for( int i = 0; i < rozmiar_tablicy; i++ ) { std::cout << "Podaj wartosc " << i << " elementu: "; std::cin >> wartosc; liczba[ i ] = wartosc; } rozmiar_tablicy--; } while( rozmiar_tablicy >= 0 ); delete[] liczba; return 0; }
#include <iostream>
int main() { int rozmiar_tablicy; int wartosc; std::cout << "Podaj wartosc: "; std::cin >> rozmiar_tablicy; std::cout << std::endl << "stworzono tablice zlozonej z " << rozmiar_tablicy << " elementow" << std::endl; int * liczba( 0 ); do { liczba = new int[ rozmiar_tablicy ]; for( int i = 0; i < rozmiar_tablicy; i++ ) { std::cout << "Podaj wartosc " << i << " elementu: "; std::cin >> wartosc; liczba[ i ] = wartosc; } rozmiar_tablicy--; } while( rozmiar_tablicy >= 0 ); delete[] liczba; return 0; }
proszę również o wyjaśnienie mi takiej kwesti: jeżeli ten fragment kodu "delete[] liczba;" przestawię do środka pętli do..while nad fragmentem kodu "rozmiar_tablicy--;" to co to zmienia? Proszę rozjaśnijcie mi również tą kwestie:) będę wdzięczny za pomoc:) |
|
pekfos |
» 2013-11-15 14:58:10 myślę że zmniejszenie rozmiaru kolejnej tablicy |
Jakie zmniejszanie tablicy? proszę również o wyjaśnienie mi takiej kwesti: jeżeli ten fragment kodu "delete[] liczba;" przestawię do środka pętli do..while nad fragmentem kodu "rozmiar_tablicy--;" to co to zmienia? |
W pierwszym kodzie spowoduje to wysypanie się programu, a w drugim załatanie wycieku pamięci. |
|
Frish Temat założony przez niniejszego użytkownika |
» 2013-11-15 15:08:16 Chodzi mi o to że tablica przy każdej kolejnej pętli zmniejsza się poprzez urzycie dekrementacji "rozmiar_tablicy--;". każda kolejna pętla ma na celu zmniejszenie rozmiaru tablicy o jedno miejsce.(W zasadzie ten program miał taki cel i stąd moje pytanie też który z kodów jest poprawnie napisany, ja myślę że drugi, nie biorąc pod uwagę wycieku pamięci )
Teraz już rozumiem że w drugim kodzie właściwe będzie zapisanie tego "delete[] liczba;" w pętli, ale napisałeś też "W pierwszym kodzie spowoduje to wysypanie się programu"...ale czy w ogóle pierwszy kod jest napisany poprawnie? |
|
pekfos |
» 2013-11-15 15:10:46 tablica przy każdej kolejnej pętli zmniejsza się poprzez urzycie dekrementacji "rozmiar_tablicy--;" |
Nic takiego nie ma miejsca. Rozmiar tablicy jest wciąż ten sam. ale czy w ogóle pierwszy kod jest napisany poprawnie? |
Działa? |
|
Frish Temat założony przez niniejszego użytkownika |
» 2013-11-15 15:16:25 przecież przy kolejnej pętli " liczba = new int[ rozmiar_tablicy ];" jest zmieniane przez dekrementacje "rozmiar_tablicy--;" o jedno miejsce to dlaczego mówisz że tablica jest te samej wielkości?
No właśnie chcialem się dowiedzieć czy jest dobrze napisany. Program działa ale nie wiem w takim razie czym się różni działanie pierwszego kodu od drugiego. |
|
pekfos |
» 2013-11-15 15:20:29 Tu zmieniasz rozmiar przez alokację nowej tablicy. Sama dekrementacja nic nie zmienia, poza zmniejszeniem wartości zmiennej. nie wiem w takim razie czym się różni działanie pierwszego kodu od drugiego |
W pierwszym nie zmieniasz rozmiaru tablicy, a w drugim niepotrzebnie zmieniasz rozmiar tablicy. |
|
Frish Temat założony przez niniejszego użytkownika |
» 2013-11-15 15:27:13 Najwidoczniej zle ująłem wszystko w słowach ale jeszcze nie umiem się takim jezykiem programisty dobrze posługiwać...właśnie o to mo chodziło, czyli za każdym razem niejako alokuje nową tablice o zmniejszonej liczbie miejsc?
|
|
kubawal |
» 2013-11-15 16:39:45 Tak, i co ważniejsze nie dealokujesz tamtej starej |
|
« 1 » |