Rozdział 44 Poz. 5 - new i delete - problem z zadanie domowym (program wyrzuca źle dwie ostatnie liczby)
Ostatnio zmodyfikowano 2018-08-25 13:27
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;? #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 ]; } for( int i = 0; i < rozmiar; ++i ) nowa[ i ] = tablica[ i ]; delete[] stara; nowa[ rozmiar ] = liczba; delete[] tablica; 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; }
|
|
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ć. 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. |
|
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 ]; #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 ]; } for( int i = 0; i < rozmiar; ++i ) nowa[ i ] = tablica[ i ]; nowa[ rozmiar ] = liczba; delete[] tablica; 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; }
|
|
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ć. |
|
|
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! |
|
pekfos |
» 2018-08-25 13:27:43 Założę się, że kod jest wciąż niepoprawny. |
|
« 1 » |