Naruszenie zasad dostępu podczas odczytywania w lokalizacji...

0

Mam do napisania program który testuje czas sortowania metodą quicksort. Test ma być przeprowadzony dla rozmiaru tablicy od 10k do 1M, wielkości rosną o 10k dla poszczególnego testu. W tablicy znajdują się losowo generowane liczby z zakresu od 0 do wielkości tablicy. Program który napisałem działa poprawnie dla tablic mniejszych od 140k. Przy próbie sortowania tablic większych pojawia się informacja: Zgłoszono wyjątek w lokalizacji 0x00AD12B5 w quicksortvisual.exe: 0xC0000005: Naruszenie zasad dostępu podczas odczytywania w lokalizacji 0x04BD8000. Nieobsłużony wyjątek w lokalizacji 0x00AD12B5 w quicksortvisual.exe: 0xC0000005: Naruszenie zasad dostępu podczas odczytywania w lokalizacji 0x04BD8000.
Kod wygląda następująco:

#include<iostream>
#include<fstream>
#include<ctime>
#include <algorithm>
#include<string>
#include<stdexcept>

using namespace std;

long partition_q(int* tab, long left, long right)
{
    long int pivot_element = tab[left];
    long int lb = left, ub = right;
    int temp;

    while (left < right)
    {
        while (tab[left] <= pivot_element)
            left++;
        while (tab[right] > pivot_element)
            right--;
        if (left < right)
        {
            temp = tab[left];
            tab[left] = tab[right];
            tab[right] = temp;
        }
    }
    tab[lb] = tab[right];
    tab[right] = pivot_element;
    return right;
}

void quick_sort(int* Tab, long int p,long int r)
{
    if (p < r)
    {
        int q = partition_q(Tab, p, r);
        quick_sort(Tab, p, q - 1);
        quick_sort(Tab, q + 1, r);

    }
}

int main()
{
    ifstream pl;
    ofstream wy;
    string plik, ipath="dane\\1\\", opath="wyniki\\skrajny\\1\\";
    for (int ilo = 10000; ilo < 1000000; ilo += 10000)
    {
        plik = to_string(ilo) + ".txt";
        int* tab = new int[ilo];
        pl.open(ipath + plik);
        if (!pl.good()) throw logic_error("blad pliku");
        for (int a = 0; a < ilo; a++) pl >> tab[a];
        pl.close();
        clock_t start=clock();
        quick_sort(tab, 0, ilo - 1);
        clock_t end = clock();
        double roz = ((double)end-(double)start) / (double)CLOCKS_PER_SEC;
        wy.open(opath + plik);
        wy << ilo << ";" << roz <<endl;
        wy.close();
        cout << plik<<" sorted"<<endl;
        delete [] tab;
    }
    return 0;
}

Zmieniałem już zarezerwowany rozmiar stosu jednak to nie pomaga. Moje ustawienia w Visual Studio 2019 wyglądają następująco: screenshot-20211206195459.png
Nie mam pomysłu co może być przyczyną. Liczę, że jakieś inne oko dopatrzy się błędu.

1

Polecam sprawdzić co się dzieje, jak będziesz mieć do posortowania dane 0x4000000, 0x3000000, 0x2000000

0

@enedil: Na ustawionym debugu pokazuje takie coś : Zgłoszono wyjątek w lokalizacji 0x00DEC5FB w quicksortvisual.exe: 0xC0000005: Naruszenie zasad dostępu podczas odczytywania w lokalizacji 0x00D7D000. Zgłoszono nieobsługiwany wyjątek: naruszenie dostępu do odczytu. **tab** było 0x1E8D112.
A sam visual pokazuje takie coś:
screenshot-20211206210230.png

2

Porównaj left I right z rozmiarem tablicy. Albo jeszcze lepiej: zamień tab* na std::vector i wyłuskuj dane przez at(x) zamiast wskaźnikowo, zobaczysz bardzo szybko gdzie wylatujesz poza zakres.

0

@alagner: Racja left wywalało grubo poza obszar tablicy. Coś jest nie tak z funkcją partition_q ale to już sam powinienem sobie poradzić

1 użytkowników online, w tym zalogowanych: 0, gości: 1