Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Dynamiczna alokacja pamięci

Ostatnio zmodyfikowano 2013-11-15 16:39
Autor Wiadomość
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.

C/C++
#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;
}

C/C++
#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:)
P-96296
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.
P-96300
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?
P-96301
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?
P-96302
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.
P-96303
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.
P-96304
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?

 
P-96305
kubawal
» 2013-11-15 16:39:45
Tak, i co ważniejsze nie dealokujesz tamtej starej
P-96306
« 1 »
  Strona 1 z 1