Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
1

Выбрасывает исключение при сортировке

24.06.2019, 21:13. Показов 791. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
не могу понять из-за чего выбрасывает исключение при сортировке
const T& GetData(int index) const - здесь исключение выбрасывает

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    Node<T>* GetNode(int index) const
    {
        if(index > size || index < 0)
        {
            throw("\nВыход за границы массива");
        }
        else
        {
            Node<T> *temp = Head;
 
            int i = 0;
 
            while(temp && i < index)
            {
                temp = temp->Next;
                i++;
            }
            
            return temp;
        }
    }
    const T& GetData(int index) const
    {
        if(GetNode(index))
        {
            return GetNode(index)->data;
        }
        else
        {
            throw("\nВыход за границы массва!");
        }
    }
    T& GetData(int index)
    {
        const auto& me = *this;
        const T& data = me.GetData(index);
        return const_cast<T&>(data);
    }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
template<typename T> void DivList(Mylist<T>& list, Mylist<T>& left, Mylist<T>& right)
    {
        left=list;
        right=list;
        for (int i=0; i<list.size/2; ++i)
        {
            right.pop(0);
            left.pop(left.size-1);
        }
        if (list.size%2)
        {
            right.pop(0);
        }
    }
 
template<typename T> void MergeSort(Mylist<T>& list)
    {
        if (list.size>1)
        {
            Mylist<T> left;
            Mylist<T> right;
            DivList(list,left,right);
 
            MergeSort(left);
            MergeSort(right);
            Mylist<T> temp;
            while (0 < left.size || 0 < right.size)
            {
                if(left.GetData(0).get_departureTime() > right.GetData(0).get_departureTime())
                {
                    temp.push_back(left.GetData(0));
                    left.pop(0);
                }
                else
                {
                    temp.push_back(right.GetData(0));
                    right.pop(0);
                }
                if (left.size == 0)
                {
                    while (right.size)
                    {
                        temp.push_back(right.GetData(0));
                        right.pop(0);
                    }
                    break;
                }
                if (right.size == 0)
                {
                    while (left.size)
                    {
                        temp.push_back(left.GetData(0));
                        left.pop(0);
                    }
                    break;
                }
            }
 
            list = temp;
        }
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.06.2019, 21:13
Ответы с готовыми решениями:

Выбрасывает при выполнении
Пытаюсь написать хеадер для работы с большими числами, через разбиение на ряд чисел. При...

При использовании статической библиотеки выбрасывает неизвестную ошибку
Код ошибки 0x800700c1. Гугл говорит, что может быть виноват Boost, но он тут даже не...

Выбрасывает исключение при запуске
Здравствуйте. Установил студию, при попытке запустить выбрасывает сообщение &quot;an exception was...

Поток выбрасывает исключение в конце работы
Это лаба для универа, реализация шаблона производитель-потребитель. В конце работы выбрасывает...

17
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
24.06.2019, 21:17 2
Цитата Сообщение от cherc Посмотреть сообщение
const T& GetData(int index) const - здесь исключение выбрасывает
Я правильно понимаю, что вот такое - throw("\nВыход за границы массива");?
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
24.06.2019, 21:18  [ТС] 3
oleg-m1973, да. Я его закомментировал и при сортировке теряется 1 элемент списка
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
24.06.2019, 21:20 4
Покажи метод pop(.....)
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
24.06.2019, 21:20  [ТС] 5
oleg-m1973,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
    void pop(int index)
    {
        Node<T> *temp = Head;
 
        if(index > size || index < 0)
        {
            throw("\nВыход за границы массива!");
        }
        else
        {
            for(int i = 0; i != index; i++)
            {
                temp = temp->Next;
            }
 
            if(temp->Prev == nullptr)
            {
                if(size == 1)
                {
                    Head = nullptr;
                    Tail = nullptr;
                }
                else
                {
                    temp->Next->Prev = nullptr;
                    Head = temp->Next;
                }
 
                delete temp;
                size--;
                return;
            }
            if(temp->Next == nullptr)
            {
                temp->Prev->Next = nullptr;
                Tail = temp->Prev;
 
                delete temp;
                size--;
                return;
            }
            if(temp->Next != nullptr && temp->Prev != nullptr)
            {
                temp->Prev->Next = temp->Next;
                temp->Next->Prev = temp->Prev;
                delete temp;
                size--;
                return;
            }
        }
    }
0
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
24.06.2019, 21:25 6
cherc, if (index >= size || index < 0)

Добавлено через 2 минуты
cherc, я помню тебе тут помогал с этим и вроде работало, сравни что не так
Нахождение середины списка
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
24.06.2019, 21:25 7
Цитата Сообщение от cherc Посмотреть сообщение
void pop(int index)
Цитата Сообщение от cherc Посмотреть сообщение
for(int i = 0; i != index; i++)
* * * * * * {
* * * * * * * * temp = temp->Next;
* * * * * * }
Здесь надо for(int i = 0; i < index; i++)
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
24.06.2019, 21:28  [ТС] 8
oleg-m1973, все равно выбрасывает исключение
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
24.06.2019, 21:44 9
Цитата Сообщение от cherc Посмотреть сообщение
oleg-m1973, все равно выбрасывает исключение
У тебя удаление элемента сделано неправильно, наверное. Надо как-то так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (!temp)
    throw("\n!!!!!!!Выход за границы массива!");
 
if (temp == Head)
   Head = temp->Next;
if (temp == Tail)
   Tail = temp->Prev;
 
if (temp->Prev)
   temp->Prev->Next = temp->Next;
if (temp->Next)
   temp->Next->Prev  = temp->Prev;
 
delete temp;
--size;
Добавлено через 5 минут
Цитата Сообщение от cherc Посмотреть сообщение
temp.push_back(left.GetData(0));
* * * * * * * * * * * * left.pop(0);
Здесь и везде надо
C++
1
2
3
   auto *node =  right.GetData(0);
  right.pop(0);
    temp.push_back(node);
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
24.06.2019, 21:48  [ТС] 10
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
if (!temp)
* * throw("\n!!!!!!!Выход за границы массива!");
if (temp == Head)
* *Head = temp->Next;
if (temp == Tail)
* *Tail = temp->Prev;
if (temp->Prev)
* *temp->Prev->Next = temp->Next;
if (temp->Next)
* *temp->Next->Prev *= temp->Prev;
delete temp;
--size;
исключения нет но 1 элемент теряется
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
24.06.2019, 21:49  [ТС] 11
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Здесь и везде надо
C++Выделить код
1
2
3
* *auto *node = *right.GetData(0);
* right.pop(0);
* * temp.push_back(node);
ошибки
Миниатюры
Выбрасывает исключение при сортировке  
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
24.06.2019, 21:59 12
Цитата Сообщение от cherc Посмотреть сообщение
ошибки
Верни как было. Ошибся, думал, что у тебя просто элементы перемещаются между списками, а ты копируешь содержимое

Добавлено через 5 минут
Цитата Сообщение от cherc Посмотреть сообщение
исключения нет но 1 элемент теряется
Общее количество элементов нечётное?

Добавлено через 1 минуту
Если да (или если ты делишь список не пополам), то, скорее всего, вот из-за этого цикла
Цитата Сообщение от cherc Посмотреть сообщение
while (0 < left.size || 0 < right.size)
0
zayats80888
24.06.2019, 22:03
  #13

Не по теме:

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
то, скорее всего, вот из-за этого цикла
это цикл сборки списков обратно, деление до происходит

0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
24.06.2019, 22:06 14
Цитата Сообщение от zayats80888 Посмотреть сообщение
это цикл сборки списков обратно, деление до происходит
А, ну да, вижу. Элементы из большего добавляются в конец
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
24.06.2019, 22:07  [ТС] 15
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Общее количество элементов нечётное?
четное
0
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
24.06.2019, 22:15 16
cherc, Вы уже нагородили кучу кода на основе этого списка, а теперь полезли его переделывать
Попробуйте вернуть как было
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Node<T>* GetNode(int i) const {
    if (i<0 || i>size - 1) return 0;
    Node<T>* temp = Head;
    for (int j = 0; j < i; ++j) temp = temp->Next;
    return temp;
}
 
T& GetData(int i) {
    Node<T>* temp = GetNode(i);
    if (temp) return GetNode(i)->data;
    else throw("\n!!!!!!!Выход за границы массива!");
}
 
void pop(int index) {
    Node<T> *temp = GetNode(index);
    if (!temp) return;
    if (temp->Next) temp->Next->Prev = temp->Prev;
    else Tail = temp->Prev;
    if (temp->Prev) temp->Prev->Next = temp->Next;
    else Head = temp->Next;
    delete temp;
    --size;
}
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
24.06.2019, 22:20  [ТС] 17
zayats80888, не помогло. Как же я не люблю этот 2-ный список
0
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
24.06.2019, 22:29 18
Цитата Сообщение от cherc Посмотреть сообщение
не помогло.
Пройдитесь отладчиком, посмотрите стек вызовов, может исключение вообще не в сортировке а в другом месте программы выскакивает.
0
24.06.2019, 22:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.06.2019, 22:29
Помогаю со студенческими работами здесь

Pyexcel выбрасывает исключение: check if there were typos in function parameters
Помогите, пожалуйста! Ситуация (код упрощаю): import pyexcel res_arr = , ]...

ObservableCollection: В момент прокрутки ListBox программа выбрасывает исключение InvalidCastException
Есть класс: public class Author : IComparable { public string FirstName; public string...

Выбрасывает исключение, что в словаре уже есть такой ключ
Пытаюсь сделать чтение из xml и добавление в словарь, код такой: if(!File.Exists(@&quot;articles.xml&quot;))...

Массив внутри класса static. Выбрасывает исключение на методе .Split
здравствуйте! доделываю ранее заказанную программу. столкнулся с гнпонятным. объявлен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru