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

Problem z dziwną wartością funkcji main

Ostatnio zmodyfikowano 2015-11-04 14:23
Autor Wiadomość
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 ------------------------------------------------
C/C++
#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 ------------------------------------------------
C/C++
#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_HPP

----------------------------- sortowanie_przez_scalanie.cpp ------------------------------------------------
C/C++
#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++ ];
   
}
P-139618
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 ?
P-139619
j23
» 2015-11-04 09:32:28
Prawdopodobnie ten jawnie wywoływany destruktor powoduje błąd - dwa razy usuwana jest pamięć 'helpTab' i 'sortTab';
P-139621
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]
P-139624
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?
P-139627
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:
C/C++
helpTab = new int( aamount );

sortTab = new int( aamount );

które nie alokuje tablice intów tylko pojedynczego inta z wartością aamount, na:
C/C++
elpTab = new int[ aamount ];

sortTab = new int[ aamount ];

które alokuje całą tablicę. A w destruktorze zamień
C/C++
delete helpTab;
delete sortTab;

na:
C/C++
delete[] helpTab;
delete[] sortTab;

P-139629
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.
P-139631
« 1 »
  Strona 1 z 1