5 / 5 / 1
Регистрация: 09.12.2020
Сообщений: 194
|
|||||||||||||||||||||||||||||||
1 | |||||||||||||||||||||||||||||||
Неправильный Qsort09.12.2020, 11:43. Показов 1345. Ответов 13
==Delphi7
Если я использую классику сортировки, то все сортируется правильно, даже если я использую массив ссылок на массив входа байтов, которые надо сортировать. То есть, если в текущем коде вот это, то сортируется правильно
Испробовал все, давал адреса в функцию, смещения и прочее, все неправильно, даже если сделать вот так, то неправильно сортирует
Добавлено через 3 часа 43 минуты
0
|
09.12.2020, 11:43 | |
Ответы с готовыми решениями:
13
Неправильный логин и неправильный пароль, программа не выдает сообщения об ошибке Неправильный парсинг строки и неправильный её вывод qsort qsort |
3759 / 2263 / 705
Регистрация: 29.05.2013
Сообщений: 9,613
|
||||||
09.12.2020, 12:11 | 2 | |||||
Если a>b или a=b функция будет возвращать все равно False, вот и получаете неправильный результат сортировки
0
|
5 / 5 / 1
Регистрация: 09.12.2020
Сообщений: 194
|
|
09.12.2020, 12:12 [ТС] | 3 |
Сильно сомневаюсь, что настройки виноваты
0
|
5 / 5 / 1
Регистрация: 09.12.2020
Сообщений: 194
|
|
09.12.2020, 12:20 [ТС] | 4 |
Неправильный ?
while a[i] < x do i:=i+1; // именно так в оригинале работает нормально Аналогично в Function CmpByte (a, b: byte): boolean; Result:= a < b; У меня большая просьба проверить этот код в Дельфи, пжлста )))
0
|
3759 / 2263 / 705
Регистрация: 29.05.2013
Сообщений: 9,613
|
|
09.12.2020, 12:28 | 5 |
Массив А у вас какого типа?
0
|
5 / 5 / 1
Регистрация: 09.12.2020
Сообщений: 194
|
|||||||||||
09.12.2020, 12:41 [ТС] | 6 | ||||||||||
0
|
3759 / 2263 / 705
Регистрация: 29.05.2013
Сообщений: 9,613
|
||||||
09.12.2020, 12:46 | 7 | |||||
А вы измените размерность массива
0
|
5 / 5 / 1
Регистрация: 09.12.2020
Сообщений: 194
|
|
09.12.2020, 12:50 [ТС] | 8 |
Мне надо сортировать от 100 Мб и выше
На 10 символах в файле я трассировал, все правильно, конечно 1к байт и выше отследить невозможно. Можете проверить код ?
0
|
5 / 5 / 1
Регистрация: 09.12.2020
Сообщений: 194
|
|
09.12.2020, 13:04 [ТС] | 9 |
Проблема именно в функции. Я уже вкладывал ее в процедуру, все равно не работает, как надо, есть ошибки
0
|
5 / 5 / 1
Регистрация: 09.12.2020
Сообщений: 194
|
|
10.12.2020, 09:41 [ТС] | 10 |
Я вспомнил, эта проблема была и раньше, но я переписал фукцию сравнения на ассемблер и проблема была решена, все сортировалось правильно. Листинг ассемблера остался, но как переписать на Вин32-64 даже не знаю, немного погуглил, 4 регистра точно надо сохранять, но как добраться к адресу данных через AllocMem, я не знаю.
Если я понял правильно, регистры называются как AX -> EAX(32) RAX(64), но непонятно, как получить адрес и писать туда байты. Все равно придется переписывать на ассемблер для скорости, может кто поможет ?
0
|
Модератор
3751 / 2251 / 782
Регистрация: 15.11.2015
Сообщений: 8,964
|
||||||
10.12.2020, 12:43 | 11 | |||||
Лучше так:
0
|
5 / 5 / 1
Регистрация: 09.12.2020
Сообщений: 194
|
|
10.12.2020, 12:46 [ТС] | 12 |
Все равно не работает, массив конечно сортируется, но на выходе есть частично мусор.
0
|
Модератор
3751 / 2251 / 782
Регистрация: 15.11.2015
Сообщений: 8,964
|
|
10.12.2020, 13:33 | 13 |
Сообщение было отмечено West2000 как решение
Решение
Где минимальный проект, в котором это проявляется? Или предлагаешь нам самостоятельно додумать и собирать проект?
1
|
5 / 5 / 1
Регистрация: 09.12.2020
Сообщений: 194
|
||||||
10.12.2020, 18:52 [ТС] | 14 | |||||
Мдя уж... Вычистил все, чтобы минимально получилось.
Все заработало нормально... Непонятно..
В общем, я подумал и у меня только одна версия - компилятор сохранил настройки неправильно, хотя код вроде работает, но частично не совсем так. Такое уже было, только сейчас об этом вспомнил. Код я почистил от лишнего, сделал новый проект и вставил туда код, только тогда заработало правильно. Наверное и с исходным кодом все работать будет, надо проверить. Итого - код работает правильно, но крови мне компилятор Дельфи7 попил много, неделя впустую, я уже подумал, что чего-то не понимаю, поэтому обратился сюда на сайт. Но и Дельфи10.2 тоже не идеал, глючит иногда, вот почему я проверяю критичный код в 2 компиляторах. Почему Дельфи7 ? Все равно надо делать 32-64 бит версии, а 7 быстрей будет работать, ну и размер меньше, это не суть важно, но все таки. Сейчас проверил сортировку на 100 МБ, заодно подключил таймер, все работает правильно. Ну и собсно хочу сказать спасибо сайту, проблему решили вместе. ))) Просто когда много кода, сложно понять, где косяк, начинаю упрощать код для проверки и опять ошибка, мозг кипит.. В качестве последней информации, которую недавно проверил. В тырнете не все так однозначно описано... MergeSort, ну да, работает быстро, но мне не применить его. Еще быстрее работает пирамидальная сортировка, уже можно применить для меня, там линейная скорость. Но в любом случае, Qsort работает быстрее, но там другая проблема - он затыкается на одинаковых строках и начинает тормозить. Это решается предсортировкой AnySort или сортировка выбором, а потом уже применить Qsort, вполне нормальная скорость сортировки получается. Ну а если Qsort переписать на ассемблер, то скорость повышается 10-100 раз, причем не весь сорт, а только процедуру сравнения строк, проверял раньше практически. До RadixSort еще не добрался, наверное не слишком быстро будет, подожду. Стал делать свою сортировку, но пока логику обдумываю, код будет короткий, но надо все продумать. Вот так незаметно накопилось много кода и компилятор глюкнул. Если включена Оптимизация, то скорость увеличивается примерно на 20%, но есть опасность генерации неправильного кода, поэтому я пишу черновик без Оптимизации и проверяю. Ну вот добавилось еще неправильное сохранение настроек... Ну что же, может еще что спрошу, сильно не ругайте меня )))
0
|
10.12.2020, 18:52 | |
10.12.2020, 18:52 | |
Помогаю со студенческими работами здесь
14
qSort qsort C++ qsort qsort qsort Вопрос по ()qsort Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |