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

Rozdział 44 Poz. 5 - new i delete - problem z zadanie domowym (program wyrzuca źle dwie ostatnie liczby)

Ostatnio zmodyfikowano 2018-08-25 13:27
Autor Wiadomość
W1ll_3ty
Temat założony przez niniejszego użytkownika
Rozdział 44 Poz. 5 - new i delete - problem z zadanie domowym (program wyrzuca źle dwie ostatnie liczby)
» 2018-08-23 00:58:59
Witam,
w zad. dom. w rozdziale 44. po zmodyfikowaniu kody, skompilowaniu kodu i uruchomieniu programu, ten wypisuje źle dwie ostatnie liczby(mają po 7 cyfr). Proszę o nakierowanie mnie na błąd. Podaję kod, wiem, że nie użyłem funkcji ale jest to druga wersja tego zadania domowego, bo gdy używałem funkcji też był ten problem i chciałem po prostu sprawdzić, czy błędu nie ma w którejś z funkcji ale najwidoczniej chyba nie. Mam też pytanie, w rozdziale 44 i 43 przy tworzeniu pustego wskaźnika autor używa "nullptr", u mnie to nie działa i muszę zmieniać np. na "NULL". Oraz dlaczego w przykładnie ostatnim w rozdziale 44 na końcu kodu nie ma return 0;?
C/C++
#include <iostream>
using namespace std;

int main()
{
    int * tablica = NULL, rozmiar = 0;
    int x = 10;
    int * nowa = new int[ x ];
    int * stara;
    cout << "Podawaj liczby, 0 konczy wczytywanie.\n";
   
    while( true )
    {
        int liczba;
        cin >> liczba;
       
        if( liczba == 0 )
             break;
       
        if( rozmiar == x )
        {
            x *= 2;
            stara = nowa;
            int * nowa = new int[ x ];
        }
       
        // Skopiuj dane
        for( int i = 0; i < rozmiar; ++i )
             nowa[ i ] = tablica[ i ];
       
        delete[] stara;
        // Dodaj nową wartość
        nowa[ rozmiar ] = liczba;
       
        // Usuń starą tablicę
        delete[] tablica;
       
        // Zakutalizuj zmienne
        tablica = nowa;
        rozmiar++;
    }
   
    cout << "Te same liczby, ale odwrotnie!\n";
   
    for( int i = rozmiar - 1; i >= 0; --i )
         cout << tablica[ i ] << ' ';
   
    delete[] tablica;
    return 0;
}
P-172191
pekfos
» 2018-08-23 12:21:32
Dziwnie skonstruowany jest ten twój kod. Za dużo zmiennych. W jednym obiegu pętli warunkowo alokujesz pamięć i 2 razy bezwarunkowo zwalniasz, to nie powinno tak wyglądać.

C/C++
stara = nowa;
int * nowa = new int[ x ];
Zmienna nowa w drugiej linii to inna nowa, niż ta z pierwszej.

Mam też pytanie, w rozdziale 44 i 43 przy tworzeniu pustego wskaźnika autor używa "nullptr", u mnie to nie działa i muszę zmieniać np. na "NULL".
Włącz wsparcie C++11.

Oraz dlaczego w przykładnie ostatnim w rozdziale 44 na końcu kodu nie ma return 0;?
Przyzwyczajenie :P Wyjście z main() bez zwrócenia wartości działa jak return 0 - to cecha wyjątkowa dla tej funkcji, w każdej innej jest to niezdefiniowane zachowanie.
P-172192
W1ll_3ty
Temat założony przez niniejszego użytkownika
» 2018-08-23 23:48:46
Okej, już zrozumiałem, że ten wskaźnik stara, jest nie potrzebny. Ale po jego usunięciu wciąż jest to samo. Zmieniłem też w pętli
int * nowa = new int[ x ];
 na
nowa = new int[ x ];
C/C++
#include <iostream>
using namespace std;

int main()
{
    int * tablica = nullptr, rozmiar = 0;
    int x = 10;
    int * nowa = new int[ x ];
    cout << "Podawaj liczby, 0 konczy wczytywanie.\n";
   
    while( true )
    {
        int liczba;
        cin >> liczba;
       
        if( liczba == 0 )
             break;
       
        if( rozmiar == x )
        {
            x *= 2;
            nowa = new int[ x ];
        }
       
        // Skopiuj dane
        for( int i = 0; i < rozmiar; ++i )
             nowa[ i ] = tablica[ i ];
        // Dodaj now¹ wartoœæ
        nowa[ rozmiar ] = liczba;
       
        // Usuñ star¹ tablicê
        delete[] tablica;
       
        // Zakutalizuj zmienne
        tablica = nowa;
        rozmiar++;
    }
   
    cout << "Te same liczby, ale odwrotnie!\n";
   
    for( int i = rozmiar - 1; i >= 0; --i )
         cout << tablica[ i ] << ' ';
   
    delete[] tablica;
    return 0;
}
P-172197
pekfos
» 2018-08-24 11:51:01
W jednym obiegu pętli warunkowo alokujesz pamięć i 2 razy bezwarunkowo zwalniasz, to nie powinno tak wyglądać.
P-172200
W1ll_3ty
Temat założony przez niniejszego użytkownika
» 2018-08-25 00:37:14
Ok, dzięki wielkie, dodałem warunek do usuwania tabeli. Dzięki jeszcze raz!
P-172208
pekfos
» 2018-08-25 13:27:43
Założę się, że kod jest wciąż niepoprawny.
P-172209
« 1 »
  Strona 1 z 1