skjeleton Temat założony przez niniejszego użytkownika |
Problem z dziwną wartością funkcji main » 2015-11-04 01:33:39 Cześć! Uczę się algorytmów. Aktualnie jestem na sortowaniu poprzez scalanie. Widziałem go na tej stronie: http://www.algorytm.edu.pl/algorytmy-maturalne/sortowanie-przez-scalanie.html Chciałem go trochę przerobić, by wszytko było zamknięte w klasie (żeby nie trzeba było tworzyć pomocniczej, globalnej tablicy. Problem jest w tym, że całe sortowanie przebiega dobrze, kompilator nie wykrywa żadnych błędów, a main nie ma wartości 0, jak bym chciał, tylko coś innego: http://prntscr.com/8yrrvq Wszystkie pliki możecie pobrać tutaj: https://www.dropbox.com/s/1roaa5pah4lu4ol/sortowanie.rar?dl=0 są 3 pliki: ----------------------------- main.cpp ------------------------------------------------ #include <iostream> #include <time.h> #include <cstdlib> #include "sortowanie_przez_scalanie.hpp"
using std::cout; using std::cin; using std::endl;
bool automat = true;
int main() { srand( time( NULL ) ); int wielkosc; if( !automat ) cin >> wielkosc; else wielkosc = 5; int * tab = new int[ wielkosc ]; for( int i = 0; i < wielkosc; i++ ) if( !automat ) cin >> tab[ i ]; else { tab[ i ] = rand() % 20; } system( "cls" ); cout << endl; for( int i = 0; i < wielkosc; i++ ) cout << tab[ i ] << " "; cout << endl; sortowanie( tab, wielkosc ); for( int i = 0; i < wielkosc; i++ ) cout << tab[ i ] << " "; delete tab; return 0; }
----------------------------- sortowanie_przez_scalanie.hpp ------------------------------------------------ #ifndef SORTOWANIE_PRZEZ_SCALANIE_HPP #define SORTOWANIE_PRZEZ_SCALANIE_HPP
int * sortowanie( int *, int, bool = true );
class MergeSort { public: int * helpTab; int * sortTab; int amount; MergeSort( int *, int ); ~MergeSort(); void Dividing( int, int ); void Merge( int, int, int ); };
#endif
----------------------------- sortowanie_przez_scalanie.cpp ------------------------------------------------ #include "sortowanie_przez_scalanie.hpp"
int * sortowanie( int * originalTable, int elemAmount, bool retOriginal ) { MergeSort Sort( originalTable, elemAmount ); Sort.Dividing( 0, elemAmount - 1 ); if( retOriginal ) { for( int i = 0; i < elemAmount; i++ ) originalTable[ i ] = Sort.sortTab[ i ]; Sort.~MergeSort(); return originalTable; } else return Sort.sortTab; }
MergeSort::MergeSort( int * atable, int aamount ) : amount( aamount ) { helpTab = new int( aamount ); for( int i = 0; i < aamount; i++ ) helpTab[ i ] = 0; sortTab = new int( aamount ); for( int i = 0; i < aamount; i++ ) sortTab[ i ] = atable[ i ]; }
MergeSort::~MergeSort() { delete helpTab; delete sortTab; }
void MergeSort::Dividing( int lewy, int prawy ) { if( prawy <= lewy ) return; int srodek =( prawy + lewy ) / 2; Dividing( lewy, srodek ); Dividing( srodek + 1, prawy ); Merge( lewy, srodek, prawy ); }
void MergeSort::Merge( int lewy, int srodek, int prawy ) { int i, j; for( i = srodek + 1; i > lewy; i-- ) helpTab[ i - 1 ] = sortTab[ i - 1 ]; for( j = srodek; j < prawy; j++ ) helpTab[ prawy + srodek - j ] = sortTab[ j + 1 ]; for( int k = lewy; k <= prawy; k++ ) if( helpTab[ j ] < helpTab[ i ] ) sortTab[ k ] = helpTab[ j-- ]; else sortTab[ k ] = helpTab[ i++ ]; }
|
|
michal11 |
» 2015-11-04 02:56:17 Wstaw kod w znaczniki. Oprócz zwracania niepoprawnej wartości coś jest nie tak ? Nie sortuje ? Czy ja dobrze widzę, że ty w funkcji sortowanie jawnie wywołujesz destruktor ? |
|
j23 |
» 2015-11-04 09:32:28 Prawdopodobnie ten jawnie wywoływany destruktor powoduje błąd - dwa razy usuwana jest pamięć 'helpTab' i 'sortTab'; |
|
Monika90 |
» 2015-11-04 11:57:31 Nieprawidłowy operator delete też jest problemem, najlepiej nie używaj new i delete do tablic, jest przecież std::vector.
A kod C++ na forum wstawiaj pomiędzy znaczniki [cpp]tutaj twój kod[/cpp] |
|
skjeleton Temat założony przez niniejszego użytkownika |
» 2015-11-04 12:57:31 Tak, jak powiedzieliście, usunąłem to jawne wywołanie destruktora. Niestety w niczym to nie pomogło. Wciąż pokazuje mi się ten sam komunikat.
michal11, nie, czasem też nie sortuje: (nie sortuje): http://prntscr.com/8ywdqy (sortuje):http://prntscr.com/8ywdy6
Monika90, wiem, że jest biblioteka vector, ale jak bez niej powinienem stworzyć dynamiczną tablicę. Rozumiem, że nie za pomocą new i delete, ale to w jaki sposób?
|
|
michal11 |
» 2015-11-04 13:26:50 OK, błędy masz w 2 miejscach, nie licząc jawnego destruktora, a mianowicie w konstruktorze i destruktorze MergeSort. Używasz złych operatorów do alokowania i dealokowania pamięci, musisz zamienić w konstruktorze: helpTab = new int( aamount );
sortTab = new int( aamount );
które nie alokuje tablice intów tylko pojedynczego inta z wartością aamount, na: elpTab = new int[ aamount ];
sortTab = new int[ aamount ];
które alokuje całą tablicę. A w destruktorze zamień delete helpTab; delete sortTab;
na: delete[] helpTab; delete[] sortTab;
|
|
skjeleton Temat założony przez niniejszego użytkownika |
» 2015-11-04 14:23:18 Ok, pozmieniałem na vectory i jest wszystko w porządku. Wszystko działa. Dzięki wszystkim! maichl11, faktycznie, nie zauważyłem, że użyłem nawiasów okrągłych, to na pewno było powodem błędów. |
|
« 1 » |