Russian Qt Forum
Июля 04, 2025, 01:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Сортировка массива qsort  (Прочитано 25956 раз)
8: Undefined index: LANG_NAME
Файл: /var/www/html/Sources/geshi/geshi.php
Строка: 4032
chu
Гость
« : Апреля 05, 2013, 09:40 »

Не получается отсортировать массив.
Пишу так:
Код:
#include "widget.h"
#include "ui_widget.h"

#include <stdlib.h>
#include <QDateTime>
#include <QDebug>

static int cmp(const void *a, const void *b)
{
    return strcmp(* (char * const *) a, * (char * const *) b);
}

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    QString str;
    char arr[20];
    qsrand(QDateTime::currentMSecsSinceEpoch());
    for(int i=0; i<20; i++)
    {
        arr[i] = qrand()%100 + 1;
        str.append(QString::number(arr[i]) + " ");
    }

    qDebug()<<str;

    qsort(&arr[0], 20, sizeof(char *), cmp);

    str.clear();
    for(int i=0; i<20; i++)
    {
        str.append(QString::number(arr[i]) + " ");
    }
    qDebug()<<str;
}

Widget::~Widget()
{
    delete ui;
}
На строке с qsort приложение вылетает.
Что не так?
Записан
VPS
Гость
« Ответ #1 : Апреля 05, 2013, 09:50 »

А что это за тип: (char * const *) a?
Записан
chu
Гость
« Ответ #2 : Апреля 05, 2013, 09:55 »

А что это за тип: (char * const *) a?
скопировал это из документации к методу qsort
Записан
chu
Гость
« Ответ #3 : Апреля 05, 2013, 10:01 »

Исправил:
Код:
static int cmp(const void *a, const void *b)
{
    return strcmp((const char*) a, (const char*) b);
}
заработало!
vps, спасибо!
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #4 : Апреля 05, 2013, 10:01 »

А что это за тип: (char * const *) a?
Это указатель на константный указатель на char, что непонятно Улыбающийся ?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Апреля 05, 2013, 10:05 »

Исправил:
Код:
static int cmp(const void *a, const void *b)
{
    return strcmp((const char*) a, (const char*) b);
}
заработало!
У Вас элемент - один char, его и сортируйте
Код
C++ (Qt)
static int cmp(const void *a, const void *b)
{
   char c1 = *(char *) a;
   char c2 = *(char *) b;
   if (c1 < c2) return -1;
   if (c1 > c2) return +1;
   return 0;
}

И здесь так

Код
C++ (Qt)
qsort(&arr[0], 20, sizeof(char), cmp);
 
(без *)
« Последнее редактирование: Апреля 05, 2013, 10:08 от Igors » Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #6 : Апреля 05, 2013, 10:09 »

ну тогда уж и не
Код:
qsort(&arr[0], 20, sizeof(char *), cmp);
а
Код:
qsort(&arr[0], 20, sizeof(char), cmp);

а еще лучше
Код:
std::sort(&arr[0],&arr[20]);
P.S опередили
« Последнее редактирование: Апреля 05, 2013, 10:12 от alex312 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Апреля 05, 2013, 10:15 »

P.S опередили
Улыбающийся К слову: qsort (из stdlib) часто оказывается заметно шустрее std::sort (qSort).
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #8 : Апреля 05, 2013, 10:19 »

И я хочу)

Код
C++ (Qt)
#include <iostream>
#include <algorithm>
#include <random>
#include <iterator>
 
using namespace std;
 
int main()
{
   const int N = 20;
   char arr[N];
 
   std::mt19937 gen;
   std::uniform_int_distribution<int> dist(0, 100);
 
   std::generate(arr, arr+N, std::bind(dist, gen));
 
   std::cout << "before sorting:" << std::endl;
   std::copy(arr, arr+N, std::ostream_iterator<int>(std::cout, " "));
 
   std::cout << std::endl << "after sorting:" << std::endl;
 
   std::sort(arr, arr+N);
   std::copy(arr, arr+N, std::ostream_iterator<int>(std::cout, " "));
 
   return 0;
}
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #9 : Апреля 05, 2013, 10:28 »

И я хочу)
тогда уж так:
Код
C++ (Qt)
#include <iostream>
#include <algorithm>
#include <random>
#include <iterator>
#include <vector>
 
using namespace std;
 
int main()
{
   const int N = 20;
   std::vector<char> arr(N);
 
   std::mt19937 gen;
   std::uniform_int_distribution<int> dist(0, 100);
 
   std::generate(arr.begin(), arr.end(), std::bind(dist, gen));
 
   std::cout << "before sorting:" << std::endl;
   std::copy(arr.begin(), arr.end(), std::ostream_iterator<int>(std::cout, " "));
 
   std::cout << std::endl << "after sorting:" << std::endl;
 
   std::sort(arr.begin(), arr.end(),[](char a, char b){return a<b;});
   std::copy(arr.begin(), arr.end(), std::ostream_iterator<int>(std::cout, " "));
 
   return 0;
}
 
« Последнее редактирование: Апреля 05, 2013, 15:07 от alex312 » Записан