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

Lekcja 44 - zarządzanie pamięcią new i delete.

Ostatnio zmodyfikowano 2018-03-02 19:27
Autor Wiadomość
marcinpro
Temat założony przez niniejszego użytkownika
» 2018-03-02 10:58:24
Program przestał działać :D zapewne źle wykorzystuje zwracanie wartości przez funkcje.

C/C++
#include <iostream>

using namespace std;

int * kopiowanietab( int * staratab, int * nowatab, int iloscliczb )

{
    for( int i = 0; i < iloscliczb; i++ )
         nowatab[ i ] = staratab[ i ];
   
    return nowatab;
}

void wypisz( int iloscliczb, int tab[], int rozmiartab )

{
    cout << "Liczby podane do tablicy wypisane odwrotnie: ";
    for( int i = iloscliczb - 1; i >= 0; --i )
         cout << tab[ i ] << ", ";
   
    cout << endl << "Rozmiar tablicy:" << rozmiartab << endl;
}

int * powiekszenietab( int * staratab, int & rozmiar, int iloscliczb )

{
    int * nowatab = new int[ rozmiar * 2 ];
    kopiowanietab( staratab, nowatab, iloscliczb );
    rozmiar *= 2;
    delete[] staratab;
    return nowatab;
}

int main()
{
    int liczba = 0;
    int indeks = 0;
    int rozmiartab = 1;
    int iloscliczb = 0;
    int * tab = nullptr;
    cout << "Podawaj liczby, 0 konczy wczytywanie.\n";
   
    while( true )
    {
       
        int liczba = 0;
        cin >> liczba;
       
        if( liczba == 0 )
             break;
        else
             iloscliczb++;
       
        if( iloscliczb >= rozmiartab )
             powiekszenietab( tab, rozmiartab, iloscliczb );
       
        tab[ indeks ] = liczba;
        indeks++;
       
    }
   
    wypisz( iloscliczb, tab, rozmiartab );
   
    return 0;
}
P-169680
pekfos
» 2018-03-02 11:08:43
Skoro wiesz w czym problem, czemu go nie naprawisz..? Powinieneś wiedzieć, jak używać funkcji.
P-169681
marcinpro
Temat założony przez niniejszego użytkownika
» 2018-03-02 11:14:06
Nie wiem po prostu jak to poprawnie zapisać. Jak wywołać funkcję w main, aby zwróciła powiększoną tab, czy zapisała. Tak samo z kopiowanie.
P-169682
YooSy
» 2018-03-02 11:48:36
Na starcie są już problemy z wartościami zmiennch:
C/C++
if( iloscliczb >= rozmiartab ) // iloscliczb = 0, a rozmiartab = 1
     powiekszenietab( tab, rozmiartab, iloscliczb ); // czyli to się nie wykona za pierwszym razem

tab[ indeks ] = liczba; // więc tutaj próbujesz wstawić liczbę do niezainicjalizowanej tablicy

Jak wywołać funkcję w main, aby zwróciła powiększoną tab, czy zapisała.
tab = powiekszenietab( tab, rozmiartab, iloscliczb );
 Tak na moje oko to tutaj jest za dużo argumentów. Nie trzeba przekazywać aktualnej liczby elementów,
bo wywołujesz ją gdy ilość liczby jest równa rozmiarowi.

Niepotrzebnie komplikujesz sobie życie dodając zmienne, które zapewne mają pomóc w zrozumieniu kodu,
ale jest dokładnie odwrotnie.

Tak to by mogło wyglądać:
C/C++
#include <iostream>

void copy( int * src, int * dest, int size ) {
    for( int i = 0; i < size; ++i ) {
        dest[ i ] = src[ i ];
    }
}

int * resize_array( int * old_array, int * size ) {
    int * new_array = new int[ * size * 2 ];
    copy( old_array, new_array, * size );
    * size *= 2;
    delete[] old_array;
    return new_array;
}

void print( int * begin, int * end ) {
    while( begin != end ) {
        std::cout << *( begin++ ) << ' ';
    }
}

int main()
{
    int capacity = 2;
    int * arr = new int[ capacity ];
    int size = 0;
    int number;
    while(( std::cin >> number ) && number ) {
        if( size >= capacity ) {
            arr = resize_array( arr, & capacity );
        }
        arr[ size++ ] = number;
    }
    std::cout << "calkowita dlugosc: " << capacity << "\nobecny rozmiar: " << size << std::endl;
    print( arr, arr + size );
    std::cout << std::endl;
}
P-169683
marcinpro
Temat założony przez niniejszego użytkownika
» 2018-03-02 18:17:55
Ok, z twojego przykładu sporo się ciekawych rzeczy wyłapałem. Poprawiłem swój kod.

C/C++
while(( std::cin >> number ) && number )

Nie wiem jak mam rozumieć do końca ten warunek. Przerywam pętle wtedy kiedy nie podam liczby( nie zapisze się wartość do inta)?

Czyli wywołując funkcję, wywołuję ją z argumentem adresu pamięci zmiennej i w funkcji mogę działać na jej wskaźniku.

print( arr, arr + size );  No tak tutaj było nawet w lekcji, że można tak wywołać, zawsze jeden mniej argument.

Ja się uczę/ćwiczę C++, bardziej z myślą o programowaniu mikroprocesorów/sterowników PLC, bardzo mi to pomaga.

C/C++
#include <iostream>

using namespace std;

void kopiowanietab( int * staratab, int * nowatab, int rozmiar )

{
    for( int i = 0; i < rozmiar; i++ )
         nowatab[ i ] = staratab[ i ];
   
}

void wypisz( int * begin, int * end )

{
    cout << "Liczby podane do tablicy wypisane odwrotnie: ";
    while( begin != end )
         cout << *( --end ) << ", ";
   
}

int * powiekszenietab( int * staratab, int * rozmiar )

{
    int * nowatab = new int[ * rozmiar * 2 ];
    kopiowanietab( staratab, nowatab, * rozmiar );
    * rozmiar *= 2;
    delete[] staratab;
    return nowatab;
}

int main()
{
    int liczba;
    int rozmiartab = 2;
    int iloscliczb = 0;
    int * tab = new int[ rozmiartab ];
    cout << "Podawaj liczby, 0 konczy wczytywanie.\n";
   
    while( true )
    {
        cin >> liczba;
       
        if( liczba == 0 )
             break;
       
        if( iloscliczb >= rozmiartab )
             tab = powiekszenietab( tab, & rozmiartab );
       
        tab[ iloscliczb++ ] = liczba;
       
       
    }
   
    wypisz( tab, tab + iloscliczb );
    cout << endl << "Aktualny rozmiar tablicy:" << rozmiartab << endl;
   
    return 0;
}
P-169688
YooSy
» 2018-03-02 19:27:20
while(( std::cin >> number ) && number )
 oznacza tak jak napisałeś, wykonuj póki udaje się wczytać dane do zmiennej oraz zmienna nie jest zerem (number != 0).
P-169691
1 « 2 »
Poprzednia strona Strona 2 z 2