1 / 1 / 0
Регистрация: 11.06.2023
Сообщений: 13
|
|
1 | |
Проблемы с сортировкой10.12.2023, 23:00. Показов 3969. Ответов 8
Пока я работал над сортировками, у меня уже случалось несколько инцидентов с указателями на начало и конец списков, но часть из них я исправил, часть попробовал закрыть костылями. Последнее у меня не вышло, поэтому я провел исследование и выяснил, что уже в самом начале происходят баги настолько отбитые, что я даже приблизительно не могу установить их причину, при всем моем опыте работы с указателями и наличии создателя элементов, который без проблем перекочевывал из одной работы в другую, начиная с первого (!) курса. Вкратце, в самом начале у меня есть зацикленная функция создания списка, принимающая указатели на начало и конец первоначального массива и использует их, собственно, для создания первородного массива случайных данных, копия которого затем будет создана на основе той или иной структуры (у меня есть также пирамидальная сортировка, что предполагает наличие соответствующей структуры) и отсортирована. Проблема в том, что зацикленная функция реально записывает значение начала списка в указатель его конца, а значение конца - в указатель на начало второго, буферного списка (последний даже не был инициализирован, откуда компилятор берет эти значения!??). При этом сортировка Шелла и пирамидальная сортировка работают как ни в чем ни бывало, и проблемы возникают при уже в сортировке слиянием. Как я уже упоминал, без понятья, почему это происходит именно так, буду рад ответу профессионала
Три файла (функции, заголовочный файл для них и подобие меню) я скину одним файлом, отделить одно от другого вполне возможно.
0
|
10.12.2023, 23:00 | |
Ответы с готовыми решениями:
8
Проблемы с сортировкой Проблемы с быстрой сортировкой Проблемы с быстрой сортировкой проблемы с сортировкой пузырьком Проблемы с сортировкой в TTable |
2710 / 864 / 327
Регистрация: 10.02.2018
Сообщений: 2,044
|
||||||||||||||||
11.12.2023, 09:48 | 2 | |||||||||||||||
whytivi3000, прикреплять код лучше явно, скачивать текстовый файл и копаться в нём не очень удобно. Сделаю это за вас, возможно кто-то посмотрит и ещё что-нибудь подскажет.
Со своей стороны могу сказать, что в коде очень много сомнительных решений. Они вроде и будут работать, но так лучше не делать. Пожалуй самое подозрительное - это процедура очистки списка. Второй список создаётся и уничтожается несколько раз. При втором создании голова и хвост списка не обнулены. Элементы списка удалены, но голова и хвост не обнулены и из-за этого список строится неправильно. Based.h
0
|
1 / 1 / 0
Регистрация: 11.06.2023
Сообщений: 13
|
|
11.12.2023, 11:17 [ТС] | 3 |
Но как тогда правильно обнулять? Во всех остальных работах обнуление происходило без проблем, а здесь вроде нулевое значение стоит, только заходишь в функцию - сразу какая-то тарабарщина происходит.
0
|
2710 / 864 / 327
Регистрация: 10.02.2018
Сообщений: 2,044
|
||||||
11.12.2023, 13:11 | 4 | |||||
Вот смотрите, у вас вызывается функция create2 в 625 строке.
Затем вызывается DeleteSpisok в 627 строке. А затем повторно вызывается create2 в 636 строке. В строке 103 функции create2 вы вызываете addListEndm(&head2, &tail2, temp->znach) Переменные head2 и tail2 являются переменными класса. При первом вызове create2 и первом вызове внутри него addListEndm эти переменные равны 0. При втором вызове create2 и первом вызове внутри него addListEndm эти переменные уже не равны 0. В первом случае переменные были обнулены внутри конструктора класса Sort. Во втором случае, переменные должны были бы быть обнулены внутри функции DeleteSpisok, но этого не там не делается. Просто добавьте в конец функции DeleteSpisok строку
0
|
1 / 1 / 0
Регистрация: 11.06.2023
Сообщений: 13
|
|
11.12.2023, 17:46 [ТС] | 5 |
Понятное дело, что очистка указателей нужна. Проблема в том, что и она не возымела нужного эффекта. Повторюсь, очистка производится в функции, даже превращает указатели в чисто нулевые, но при выходе они удаляются неправильно, как буду-то к нему все еще один из элементов имеет доступ, хотя у меня удаление связей также предусмотрено. Тут скорее проблема в том, какие указатели оказываются в удаляемом списке. Вот это основная причина проблем с очисткой и вообще работой функций. Скрины значений указателей внизу, там отчетливо видно, что головой у меня оказался tail1, а хвостом - head2
0
|
1 / 1 / 0
Регистрация: 11.06.2023
Сообщений: 13
|
|
11.12.2023, 17:48 [ТС] | 6 |
И это при том, что в качестве переменных я дал ссылку на начало первого списка и на его же конец.
0
|
2710 / 864 / 327
Регистрация: 10.02.2018
Сообщений: 2,044
|
||||||
11.12.2023, 18:28 | 7 | |||||
whytivi3000, ошибся я в предыдущем варианте. Нужно не указатели обнулять, а значения по указателям:
0
|
2710 / 864 / 327
Регистрация: 10.02.2018
Сообщений: 2,044
|
|
11.12.2023, 18:39 | 8 |
Сообщение было отмечено whytivi3000 как решение
Решение
Может вы просто не там смотрите значения? Такое ощущение, что вы пытаетесь увидеть значения переменных в описании класса в инклуде. Это вы глядит немного странным. Может у вас ещё до кучи слетел интелисенс. Попробуйте выполнить сканирование проекта для восстановления базы анализатора кода.
1
|
1 / 1 / 0
Регистрация: 11.06.2023
Сообщений: 13
|
|
11.12.2023, 23:46 [ТС] | 9 |
Наверное я понял в чем причина багов. Видел такую форму записи *&head1 ? Ее я приметил еще до этой работы, т.к. фактически она позволяет брать указатели на начало и конец списка прямо из объекта, что сокращает или низводит в ноль количество необходимых для ввода параметров, а это удобно. Опасности же я в ней не видел т.к. думал, что указатели, которые я передаю в функцию это и есть собственно указатели из объекта. Поэтому также я и смотрел на них из класса, а не из функции. Но похоже, что все-таки они разные, а потому логично, что мои указатели из объекта никак не стыкуются с уже имеющимися и приводят к ошибкам. Я попробую сделать теперь по человечески, позже отпишусь
Добавлено через 2 часа 39 минут Заработало) Порой обыденные вещи для одних оказываются открытием для других. Спасибо, что поделились со мной одним из них, приму во внимание.
1
|
11.12.2023, 23:46 | |
11.12.2023, 23:46 | |
Помогаю со студенческими работами здесь
9
Проблемы с поразрядной сортировкой msd Проблемы с сортировкой в подставляемых полях. AdoDataSet Сортировать массив обменной, быстрой, карманной сортировкой, сортировкой вставками Отсортировать одномерный массив, заполненный случайными числами, сортировкой Шелла и сортировкой выбором Проблемы с сортировкой Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |