Russian Qt Forum

Qt => Вопросы новичков => Тема начата: chu от Апрель 05, 2013, 09:40



Название: Сортировка массива qsort
Отправлено: 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 приложение вылетает.
Что не так?


Название: Re: Сортировка массива qsort
Отправлено: VPS от Апрель 05, 2013, 09:50
А что это за тип: (char * const *) a?


Название: Re: Сортировка массива qsort
Отправлено: chu от Апрель 05, 2013, 09:55
А что это за тип: (char * const *) a?
скопировал это из документации к методу qsort


Название: Re: Сортировка массива qsort
Отправлено: chu от Апрель 05, 2013, 10:01
Исправил:
Код:
static int cmp(const void *a, const void *b)
{
    return strcmp((const char*) a, (const char*) b);
}
заработало!
vps, спасибо!


Название: Re: Сортировка массива qsort
Отправлено: alex312 от Апрель 05, 2013, 10:01
А что это за тип: (char * const *) a?
Это указатель на константный указатель на char, что непонятно :) ?


Название: Re: Сортировка массива qsort
Отправлено: Igors от Апрель 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);
 
(без *)


Название: Re: Сортировка массива qsort
Отправлено: alex312 от Апрель 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 опередили


Название: Re: Сортировка массива qsort
Отправлено: Igors от Апрель 05, 2013, 10:15
P.S опередили
:) К слову: qsort (из stdlib) часто оказывается заметно шустрее std::sort (qSort).


Название: Re: Сортировка массива qsort
Отправлено: m_ax от Апрель 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;
}
 


Название: Re: Сортировка массива qsort
Отправлено: alex312 от Апрель 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;
}
 


Название: Re: Сортировка массива qsort
Отправлено: m_ax от Апрель 05, 2013, 10:36
И я хочу)
тогда уж так:
Код
#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;
}
 

Аха) Но я бы, наверное vector на std::array<char, N>
и  ещё лямбду на std::less заменил бы)


Название: Re: Сортировка массива qsort
Отправлено: alex312 от Апрель 05, 2013, 10:41
Аха) Но я бы, наверное vector на std::array<char, N>
и  ещё лямбду на std::less заменил бы)
c std::array<char, N> согласен, а лямбду надо оставить :) (меняем один больше на меньше и получаем обратный порядок)


Название: Re: Сортировка массива qsort
Отправлено: m_ax от Апрель 05, 2013, 10:49
Аха) Но я бы, наверное vector на std::array<char, N>
и  ещё лямбду на std::less заменил бы)
c std::array<char, N> согласен, а лямбду надо оставить :) (меняем один больше на меньше и получаем обратный порядок)

Но и это всё фигня, на самом деле)
Без виджита это всё равно работать не будет((


Название: Re: Сортировка массива qsort
Отправлено: alex312 от Апрель 05, 2013, 11:09
Но и это всё фигня, на самом деле)
Без виджита это всё равно работать не будет((
Фигня в том, что мы забыли проинициализировать генератор, например так:
Код
C++ (Qt)
gen.seed(std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()));


Название: Re: Сортировка массива qsort
Отправлено: Igors от Апрель 05, 2013, 13:51
Код:
    std::copy(arr.begin(), arr.end(), std::ostream_iterator<int>(std::cout, " "));
А что если надо напечатать аккуратнее? Напр по 10 чисел в строке и чтобы столбики ровные. Можно ли задействовать этот крутой сынтаксыс - или придется по-народному printf ?


Название: Re: Сортировка массива qsort
Отправлено: m_ax от Апрель 05, 2013, 14:02
Код:
    std::copy(arr.begin(), arr.end(), std::ostream_iterator<int>(std::cout, " "));
А что если надо напечатать аккуратнее? Напр по 10 чисел в строке и чтобы столбики ровные. Можно ли задействовать этот крутой сынтаксыс - или придется по-народному printf ?
Не вижу проблемы..
Ещё как вариант, можно задействовать другой крутой сынтаксис:
Код
C++ (Qt)
for (auto x : arr) {
  ...
}
 

И потом, может ли ваш народный printf выводить данные, например в файл? Нет? А в osstream_iterator можно передать объект на ofstream, например, и писать данные уже в файл. Без лишних телодвижений)


Название: Re: Сортировка массива qsort
Отправлено: Igors от Апрель 05, 2013, 15:38
Код
C++ (Qt)
for (auto x : arr) {
  ...
}
 
А как оно печатает?  ???  Достаточно только это написать, что ли?  :)

И потом, может ли ваш народный printf выводить данные, например в файл? Нет? А в osstream_iterator можно передать объект на ofstream, например, и писать данные уже в файл. Без лишних телодвижений)
А с printf я могу ничего и не передавать, а назначить вывод в файл при запуске приложения  :)


Название: Re: Сортировка массива qsort
Отправлено: m_ax от Апрель 05, 2013, 16:04
Код
C++ (Qt)
for (auto x : arr) {
  ...
}
 
А как оно печатает?  ???  Достаточно только это написать, что ли?  :)
Ну как, как.. Как Ваша душа пожелает, так и напечатает.. И не только напечатает..

И потом, может ли ваш народный printf выводить данные, например в файл? Нет? А в osstream_iterator можно передать объект на ofstream, например, и писать данные уже в файл. Без лишних телодвижений)
А с printf я могу ничего и не передавать, а назначить вывод в файл при запуске приложения  :)
И на этом похоже, всё преимущество(?) и заканчивается(
Т.е. я правильно понимаю, что для Вас типонебезопасная сишная функция printf предпочтительнее стандартному механизму потоков ввода-вывода?
Вся эта концепция заложенная в основу потоков ввода-вывода, наверное, была придумана от нечего делать)
   


Название: Re: Сортировка массива qsort
Отправлено: Igors от Апрель 05, 2013, 16:43
Вся эта концепция заложенная в основу потоков ввода-вывода, наверное, была придумана от нечего делать)
Какая "вся эта" ???  Вот Вы блеснули такой конструкцией
Код
C++ (Qt)
std::copy(arr.begin(), arr.end(), std::ostream_iterator<int>(std::cout, " "));
Которую я наблюдал тут и сям не раз. Однако сам бы писал напр так
Код
C++ (Qt)
for (size_t i = 0; i < arr.size(); ++i)
printf("%8d%s", arr[i], (i % 10) ? "," : "\n");
 
Ну 2 строчки вместо одной - но делает все что мне надо и проблем у меня никаких. Спрашиваю у Вас как сделать это "в современном стиле" - ответа не получаю. Что мне остается думать? Что все оте ostream_iterator<.. - дешевые понты чтобы пустить пыль в глаза. Или это не так?  :)


Название: Re: Сортировка массива qsort
Отправлено: m_ax от Апрель 05, 2013, 17:08
Вся эта концепция заложенная в основу потоков ввода-вывода, наверное, была придумана от нечего делать)
Какая "вся эта" ??? 
Igors, не путайте концепцию, с конструкцией)
Имеется ввиду концепция единого интерфейса при работе с потоками ввода-вывода. Фишка в том, что все операции с обычными участками ввода-вывода, т.е. файлами, консолью, блоками памяти и т.д. поддерживают единый интерфейс. И средства, которые предоставляет этот механизм и сама архитектура гораздо более удобнее, гибче и безопаснее.
Стоит ли говорить о том, что всё это семейство функций printf плохо расширяется, поскольку написаны лишь для базовых C типов?
Стоит ли мне перечислять все недостатки и потенциальные грабли от использывания printf?

Кстатии, одним из основных достоинств потоков ввода-вывода является это безболезненная адаптация к введению новых классов..

Вот Ваш пример ниже:
Код
C++ (Qt)
for (size_t i = 0; i < arr.size(); ++i)
printf("%8d%s", arr[i], (i % 10) ? "," : "\n");
 
Ну 2 строчки вместо одной - но делает все что мне надо и проблем у меня никаких. Спрашиваю у Вас как сделать это "в современном стиле" - ответа не получаю. Что мне остается думать? Что все оте ostream_iterator<.. - дешевые понты чтобы пустить пыль в глаза. Или это не так?  :)
 
А давайте представим сейчас, что массив содержит не какой-нить базовый C тип, а что-нибудь чуть более сложное..

Вы всё равно упорно будете использовать printf?

 


 


Название: Re: Сортировка массива qsort
Отправлено: Igors от Апрель 06, 2013, 10:36
Фишка в том, что все операции с обычными участками ввода-вывода, т.е. файлами, консолью, блоками памяти и т.д. поддерживают единый интерфейс. И средства, которые предоставляет этот механизм и сама архитектура гораздо более удобнее, гибче и безопаснее.
Если взглянуть более узко/практично, то оказывается что далеко не все укладывается в рамки красивой концепции.

Напр вывод на консоль бедноват (нечем форматить). При копировании в файл вероятно придется крутить индиану, а нередко и писать то чего в памяти нет - или наоборот. При выводе на др устройство возникнут свои проблемы (напр размер страницы на принтере).

С точки зрения "расширяемости" - ну при любом раскладе мою структуру за меня никто не выведет, нужно писать код для I/O. И не будет он общим для консоли/памяти/файла. Возможно Вы имели ввиду что в дальнейшем обобщать удобнее (подсовывая разные итераторы в одну схему). Ну это достижимо и с помощью операторов  >> и <<

Ну хорошо, общность так общность. Вот я хочу вывести в QIODevice (напр в QFile). Как это у Вас будет выглядеть для int и для произвольной структурки (напр всего 2 int)?


Название: Re: Сортировка массива qsort
Отправлено: m_ax от Апрель 06, 2013, 11:01
Фишка в том, что все операции с обычными участками ввода-вывода, т.е. файлами, консолью, блоками памяти и т.д. поддерживают единый интерфейс. И средства, которые предоставляет этот механизм и сама архитектура гораздо более удобнее, гибче и безопаснее.
Если взглянуть более узко/практично, то оказывается что далеко не все укладывается в рамки красивой концепции.

Напр вывод на консоль бедноват (нечем форматить). При копировании в файл вероятно придется крутить индиану, а нередко и писать то чего в памяти нет - или наоборот. При выводе на др устройство возникнут свои проблемы (напр размер страницы на принтере).
Неправда, возможности форматирования в потоках вывода очень богаты. Как минимум для потоков доступны все функции форматирования printf.
Советую почитать про такие вещи как манипуляторы (пользовательские манипуляторы), форматные флаги, поля, эффекторы и т.д.

С точки зрения "расширяемости" - ну при любом раскладе мою структуру за меня никто не выведет, нужно писать код для I/O. И не будет он общим для консоли/памяти/файла. Возможно Вы имели ввиду что в дальнейшем обобщать удобнее (подсовывая разные итераторы в одну схему). Ну это достижимо и с помощью операторов  >> и <<

Ну хорошо, общность так общность. Вот я хочу вывести в QIODevice (напр в QFile). Как это у Вас будет выглядеть для int и для произвольной структурки (напр всего 2 int)?


Для моей произвольной структурки это будет выглядеть также, как и для int) 


Название: Re: Сортировка массива qsort
Отправлено: Igors от Апрель 06, 2013, 12:21
Советую почитать про такие вещи как манипуляторы (пользовательские манипуляторы), форматные флаги, поля, эффекторы и т.д.
Ну если это так просто, то почему бы Вам не тиснуть неск строк кода? Или Вы советуете то что сами не делаете?  :)

Для моей произвольной структурки это будет выглядеть также, как и для int) 
То же самое - предъявляем не только словеса, но и пример кода


Название: Re: Сортировка массива qsort
Отправлено: m_ax от Апрель 06, 2013, 18:36
Советую почитать про такие вещи как манипуляторы (пользовательские манипуляторы), форматные флаги, поля, эффекторы и т.д.
Ну если это так просто, то почему бы Вам не тиснуть неск строк кода? Или Вы советуете то что сами не делаете?  :)
Хорошо, поясню на таком примере.. Предположим у нас есть массив чего-то там.. Мы хотим иметь возможность различных форматов вывода его содержимого в поток (причём не обязательно это должна быть консоль). Например выводить в виде таблицы с заданным числом колонок и разделяющими символами, или в виде треугольной матрицы или на что фантазии хватит..
И при этом нам бы ещё хотелось иметь возможность использовать эту конструкцию в таком цепочечном выражении, типа:
Код
C++ (Qt)
os << string << '\n' << array << "аляхер маляхер" << some_value << endl;
 
Для этого народ придумал такую штуку, как эффектор. пример:

Код
C++ (Qt)
template <class Container>
class Table {
public:
   Table(const Container &container, int column, const char * tab = "\t")
       : _container(container), _col(column), _tab(tab) {}
 
   friend std::ostream& operator<<(std::ostream &os, const Table &t) {
       int i = 0;
       for (const auto & x : t._container) { (++i % t._col) ? os << x << t._tab : os << x << std::endl; }
       return os;
   }
private:
   const Container &_container;
   int _col;
   const char * _tab;
};
 
...
 
std::cout << Table<decltype(arr)>(arr, 10)  << Table<decltype(arr)>(arr, 3, "...") << endl;
 
std::ostringstream os;
os <<  Table<decltype(arr)>(arr, 10) << Table<decltype(arr)>(arr, 3, "...") << "Аляхер-маляхер" << endl;
 
std::ofstream out("example.txt");
out << Table<decltype(arr)>(arr, 10)  << Table<decltype(arr)>(arr, 4, "\t") << "Аляхер-маляхер" << endl;
 
// и т.д..
 

 :)

И заметьте, что я могу передавать в эффектор Table как обычный C массив, так и список, вектор, array и т.д.. И выводить данные в любой поток вывода, без лишних телодвижений.

Если использовать народный printf, то код моментально бы превратился в огород..


  


Название: Re: Сортировка массива qsort
Отправлено: Igors от Апрель 08, 2013, 12:03
Во всем этом нет чувства меры. Создается класс, (ну разумеется template, как же без него), привлекается новейший стандарт и.т.п. А чему же все это посвящено? Оказывается всего лишь печати по N элементов в строке. При этом до ф-ционала "допотопного" printf еще очень далеко (подложка пробелами, число знаков после запятой и др).

Вот именно за это многие (включая меня) и не любят Александреску и его птенцов - наворочено много, а дела/ф-ционала - пшик.


Название: Re: Сортировка массива qsort
Отправлено: m_ax от Апрель 08, 2013, 12:18
Во всем этом нет чувства меры. Создается класс, (ну разумеется template, как же без него), привлекается новейший стандарт и.т.п. А чему же все это посвящено? Оказывается всего лишь печати по N элементов в строке. При этом до ф-ционала "допотопного" printf еще очень далеко (подложка пробелами, число знаков после запятой и др).

Вот именно за это многие (включая меня) и не любят Александреску и его птенцов - наворочено много, а дела/ф-ционала - пшик.

Нет, это Вы так говорите, пока видите лишь необходимость выводить в консоль стандартные C типы.. Достаточно чуть усложнить задачу (да даже просто сменить тип контейнера, на, например, std::list) как тут же ситуация изменится на противоположную.. Я уже не говорю о том, что Вы будете делать с Вашим printf, когда возникнет необходимость выводить данные в разные потоки.. А если ещё тип элементов контейнера изменится? 

Что касается управление форматирования, то также можно реализовать.
например число знаков после запятой, легко:
Код
C++ (Qt)
std::cout << setprecision(6) << Table<decltype(arr)>(arr, 10) << std::endl;
 
 
Помимо этого есть ещё куча манипуляторов, как с параметрами, так и без них. (И никто Вам не мешает написать свой)
Вот некоторые из них (просто перечислю, без описания):
flush, hex, oct, dec, ws, showbase/noshowbase, showpos/noshowpos, uppercase/nouppercase, showpoint/noshowpoin, left, right, internal, scintific/fixed, setbase, setfill, setw и т.д..




Название: Re: Сортировка массива qsort
Отправлено: Igors от Апрель 08, 2013, 12:49
Помимо этого есть ещё куча манипуляторов, как с параметрами, так и без них.
Конечно есть, я с этим не спорю. Но все это выглядит как-то тяжеловесно, нет лаконичности и удобства простого printf, заряжаем пушку для стрельбы по воробьям


Название: Re: Сортировка массива qsort
Отправлено: alex312 от Апрель 08, 2013, 13:23
Конечно есть, я с этим не спорю. Но все это выглядит как-то тяжеловесно, нет лаконичности и удобства простого printf, заряжаем пушку для стрельбы по воробьям
Цитата: Igors
Вот именно за это многие (включая меня) и не любят Александреску и его птенцов - наворочено много, а дела/ф-ционала - пшик.
Вы уж определитесь, спорите или не спорите, функционала пшик или наворочено  ;D
Ну и, собственно вас никто не заставляет.

А еще есть http://www.boost.org/doc/libs/1_53_0/libs/format/doc/format.html - и компактно, и типобезопасно.


Название: Re: Сортировка массива qsort
Отправлено: Igors от Апрель 08, 2013, 18:07
Вы уж определитесь, спорите или не спорите, функционала пшик или наворочено  ;D
Я говорил что печально видеть "навороченый пшик" что, увы, часто случается с теми кто слепо следует моде  :)

Ну и, собственно вас никто не заставляет.

А еще есть http://www.boost.org/doc/libs/1_53_0/libs/format/doc/format.html - и компактно, и типобезопасно.
Ну так это творческое развитие идей printf


Название: Re: Сортировка массива qsort
Отправлено: m_ax от Апрель 08, 2013, 18:22
Ну так это творческое развитие идей printf
Вообще то, это как раз развитие темы паттерна эффектора) И основная фишка там как раз абстрагироваться от конкретного типа данных и потока вывода..

Я говорил что печально видеть "навороченый пшик" что, увы, часто случается с теми кто слепо следует моде  :)
Ещё печальней наблюдать за тем, как некоторые ретрограды изобретают немыслимые костыли, а потом всячески ищут оправдания своим архитектурным изыскам)  


Название: Re: Сортировка массива qsort
Отправлено: Igors от Апрель 08, 2013, 19:35
Ещё печальней наблюдать за тем, как некоторые ретрограды изобретают немыслимые костыли, а потом всячески ищут оправдания своим архитектурным изыскам)  
Ну хорошо, пусть я ретроград, а Вы прогрессивный талант :) Но я ничего не изобретал, написал незатейливо printf - и все дела. А Вы целый template класс соорудили только для того чтобы строку перевести. Зачем же говорить что это я изобретаю и доказываю - не было такого  :)


Название: Re: Сортировка массива qsort
Отправлено: Old от Апрель 08, 2013, 20:37
А Вы целый template класс соорудили только для того чтобы строку перевести.
Вот ключевой момент: считать создание класса/шаблона экстраординарным событием. ;)

2m_ax Igors не использует C++, он пишет на старом добром процедурном C с использованием некоторых возможностей C++: коллекции, немного классов (в основном структуры), очень редко - шаблоны для примитивных вещей. Все.
Все твои "изыски" ему просто не нужны... Пока у него самого не возникнет в этом потребности, а ее скорее всего не возникнет, потому что есть не скрываемый страх перед всем новым и неизвестным. ;)


Название: Re: Сортировка массива qsort
Отправлено: Igors от Апрель 09, 2013, 07:16
Вот ключевой момент: считать создание класса/шаблона экстраординарным событием. ;)
Создание класса/структуры ничем экстраординарным не является. А вот создание template - безусловно. Нужны веские основания, и даже если они есть - часто лучше воздержаться. Потому что дальше будет писаться в угоду уже созданным template, что нередко полностью извращает логику приложения. Хороший пример разумных template - те же исходники Qt, никаких трудностей с пониманием не возникает, потому что "в меру" и "на своем месте".

QPoint/QPointF
QPolygon/QPolygonF
и.т.д

Почему же это не template - ведь все идентично?

[/offtop]
Old, по поводу Ваших оценок - они во многом справедливы :) Но все же "не судите и не судимы будете"



Название: Re: Сортировка массива qsort
Отправлено: Old от Апрель 09, 2013, 08:49
А вот создание template - безусловно. Нужны веские основания, и даже если они есть - часто лучше воздержаться. Потому что дальше будет писаться в угоду уже созданным template, что нередко полностью извращает логику приложения. Хороший пример разумных template - те же исходники Qt, никаких трудностей с пониманием не возникает, потому что "в меру" и "на своем месте".

QPoint/QPointF
QPolygon/QPolygonF
и.т.д

Почему же это не template - ведь все идентично?
Поясните пожалуйста, как бы "полностью извратилась логика приложения", если бы типы QPoint и QPointF происходили из одного шаблона. :)

Кстати, трудности с пониманием как правило от незнания. :)
Если что-то не понимаешь, не нужно винить автора "непонятного", лучше постараться узнать то, что знает он и сразу все станет понятным.

Old, по поводу Ваших оценок - они во многом справедливы :) Но все же "не судите и не судимы будете"
В писание программ на C нет ничего дурного, очень много людей делают это каждый день. :)


Название: Re: Сортировка массива qsort
Отправлено: Igors от Апрель 09, 2013, 10:12
Кстати, трудности с пониманием как правило от незнания. :)
Если что-то не понимаешь, не нужно винить автора "непонятного", лучше постараться узнать то, что знает он и сразу все станет понятным.
Какой-то у Вас ход мысли.. ну "упрощенный". То есть если я "знаю" - то я обязательно должен это применять - иначе "неграмотный", так, что ли? :) Результат печальный: текст превращается в демонстрацию знаний - в ущерб содержательной части. Дальнейшая поддержка такого кода невыносима.

например число знаков после запятой, легко:
Код
C++ (Qt)
std::cout << setprecision(6) << Table<decltype(arr)>(arr, 10) << std::endl;
 
 
У человека впервые это увидевшего изучение подробностей Table уже займет минуты. Тут возникает др задача - число знаков. И класс Table уже моментально забыт (наигрался), лепится первое подходящее. "Не плодите сущности"  - фраза избитая но верная. Зачем был нужен класс-однодневка с ничтожным КПД? Видимо только чтобы потренироваться с decltype  :)

Поясните пожалуйста, как бы "полностью извратилась логика приложения", если бы типы QPoint и QPointF происходили из одного шаблона.  :)
Так я же незнающий/непонимающий, чего же Вы у меня спрашиваете?  :) Это Вы мне объясните


Название: Re: Сортировка массива qsort
Отправлено: Old от Апрель 09, 2013, 10:27
Какой-то у Вас ход мысли.. ну "упрощенный". То есть если я "знаю" - то я обязательно должен это применять - иначе "неграмотный", так, что ли? :)  
Нет, просто вы так "упрощенно" его поняли. :)
Не нужно обвинять в неправильности то, что не понимаете.

У человека впервые это увидевшего изучение подробностей Table уже займет минуты. Тут возникает др задача - число знаков. И класс Table уже моментально забыт (наигрался), лепится первое подходящее. "Не плодите сущности"  - фраза избитая но верная. Зачем был нужен класс-однодневка с ничтожным КПД? Видимо только чтобы потренироваться с decltype  :)
Нет. Пока вы "играетесь" с одними float все замечательно, вы в 100500 местах вывели их printf. А теперь попробуйте заменить этот float на NewNumberType, во всех 100500 printf. :)

Так я же незнающий/непонимающий, чего же Вы у меня спрашиваете?  :) Это Вы мне объясните
Вот именно, но мнение свое высказали - это все плохо, непонятно и к использованию непригодно. :)
Но забыли добавить, что это только для вас. ;)


Название: Re: Сортировка массива qsort
Отправлено: Igors от Апрель 09, 2013, 15:47
..что не понимаете.

Вот именно, но мнение свое высказали - это все плохо, непонятно ..
Откуда такое напор на мое непонимание?  :) Я понял все что написал m_ax, но хорошим решением это не считаю. Ну вышел я из того возраста когда всем восторгаются и все берут на вооружение. Вам кстати тоже недолго осталось  :)


Название: Re: Сортировка массива qsort
Отправлено: Old от Апрель 09, 2013, 16:27
но хорошим решением это не считаю.
Так покажите хорошее решение. printf это не оно. :)

Ну вышел я из того возраста когда всем восторгаются и все берут на вооружение. Вам кстати тоже недолго осталось  :)
А это от возраста не зависит. ;)


Название: Re: Сортировка массива qsort
Отправлено: Igors от Апрель 09, 2013, 17:02
Так покажите хорошее решение. printf это не оно. :)
Хорошее решение - уметь ждать и (пока) ничего не делать. Что пока нужно? Напечатать. Ну и делаю тем же printf или cout << или еще как. Через какое-то время накопится десяток, ну а может и сотня таких. Стану ли я испытывать неудобства, захочу ли это как-то организовать? Не знаю, может и нет. Но если да - я буду хорошо знать что (из моего десятка/сотни). А "скороспелое обобщение" ничего хорошего не дает.

Однако Вы уклонились от ответа: почему же QPoint(F) не template - а ведь вроде бы напрашивается?


Название: Re: Сортировка массива qsort
Отправлено: Old от Апрель 09, 2013, 17:43
Однако Вы уклонились от ответа: почему же QPoint(F) не template - а ведь вроде бы напрашивается?
Понятия не имею. Я не являюсь разработчиком Qt.


Название: Re: Сортировка массива qsort
Отправлено: alex312 от Апрель 09, 2013, 17:55
Однако Вы уклонились от ответа: почему же QPoint(F) не template - а ведь вроде бы напрашивается?
И ничего там не напрашивается.
ну и так, к сведению:
Qt начали разрабатывать в 1991-м, шаблоны были только представлены в 1993-м


Название: Re: Сортировка массива qsort
Отправлено: m_ax от Апрель 09, 2013, 20:41
Так покажите хорошее решение. printf это не оно. :)
Хорошее решение - уметь ждать и (пока) ничего не делать. Что пока нужно? Напечатать. Ну и делаю тем же printf или cout << или еще как. Через какое-то время накопится десяток, ну а может и сотня таких. Стану ли я испытывать неудобства, захочу ли это как-то организовать? Не знаю, может и нет. Но если да - я буду хорошо знать что (из моего десятка/сотни). А "скороспелое обобщение" ничего хорошего не дает.
Вот в этом то и проблема.. Ведь по сути, здесь все прекрасно понимают, что  дело даже не в конкретном printf.. На месте этого printf уже не раз вставали другие костыли, как например попытка реализации операторов сравнения для классов, для которых они совершенно не свойственны, странные постановки задач и т.п..
Причём всегда у Вас наблюдается какая то предсказуемая неудовлетворённость всем тем, что выходит за рамки, как заметил Old, концепций С-подхода в программировании..
 :(  


Название: Re: Сортировка массива qsort
Отправлено: Igors от Апрель 10, 2013, 09:33
[Причём всегда у Вас наблюдается какая то предсказуемая неудовлетворённость всем тем, что выходит за рамки, как заметил Old, концепций С-подхода в программировании..
 :(  
:) Та я ж не против "модерна" и с интересом присматриваюсь к новому. Вот только в оценках не согласен. "Ах какая изумительная конструкция, давайте ее немедленно воткнем в свой код". А стоит чуть копнуть - и выясняется что толку-то не очень много. Обычно достаточно предложить чуть-чуть более сложную задачу - и все ("достаточно одной таблетки").

Зато самооценка "начитавшегося" резко возрастает :). Многочисленные "вы не понимаете", нотки превосходства ("ну и так, к сведению"). Он наивно полагает что забив себе голову модными штучками - он сильно вырос. Ну жизнь и реальные задачи покажут


Название: Re: Сортировка массива qsort
Отправлено: Old от Апрель 10, 2013, 16:03
А стоит чуть копнуть - и выясняется что толку-то не очень много. Обычно достаточно предложить чуть-чуть более сложную задачу - и все ("достаточно одной таблетки").
Правильно - чуть задачу усложнили и printf поплыл, а потоки бодры и веселы. :)

Код
C++ (Qt)
       for( int i = 0; i < arr.size(); ++i )
               cout << setw( 8 ) << arr[ i ] << ((i % 10)? ", " : "\n");
 


Название: Re: Сортировка массива qsort
Отправлено: Igors от Апрель 10, 2013, 16:47
Правильно - чуть задачу усложнили и printf поплыл, а потоки бодры и веселы. :)

Код
C++ (Qt)
       for( int i = 0; i < arr.size(); ++i )
               cout << setw( 8 ) << arr[ i ] << ((i % 10)? ", " : "\n");
 
Кстати правильно ((i + 1) % 10). А так не возражаю, нормальный человеческий текст, без выкрутасов. Ну поток, да, не так компактно как printf, но зато свои плюсы. Да, оператор << придется определить, это норм. А чего же это Вас не несет в заумность итераторов и темплейтов? Чего же всего лишь скромный цикл for? Это ж "не круто"! Может потому что это не только проще, но и лучше?  :)


Название: Re: Сортировка массива qsort
Отправлено: Old от Апрель 10, 2013, 16:49
Кстати правильно ((i + 1) % 10).
Для меня это не важно, я ваш код копипастил. :)

А чего же это Вас не несет в заумность итераторов и темплейтов?
То что показал я - это примитивная работа с потоком, а m_ax вам вкусности показывал. Но... :)

Да, оператор << придется определить, это норм.
Для чего его определять? Потоки ваши float'ы уже умеют. :)


Название: Re: Сортировка массива qsort
Отправлено: m_ax от Апрель 10, 2013, 18:13
Правильно - чуть задачу усложнили и printf поплыл, а потоки бодры и веселы. :)

Код
C++ (Qt)
       for( int i = 0; i < arr.size(); ++i )
               cout << setw( 8 ) << arr[ i ] << ((i % 10)? ", " : "\n");
 

А чего же это Вас не несет в заумность итераторов и темплейтов? Чего же всего лишь скромный цикл for? Это ж "не круто"! Может потому что это не только проще, но и лучше?  :)
Такие "скромные" циклы for, лучше по-возможности избегать, поскольку Вы себя привязываете к конкретному контейнеру. Не у всех у них есть оператор[]. Вот захочется Вам завтра сменить вектор на список или на обычный C массив, тогда и вспомните.. что лучше..


Название: Re: Сортировка массива qsort
Отправлено: Old от Апрель 10, 2013, 18:27
Такие "скромные" циклы for, лучше по-возможности избегать, поскольку Вы себя привязываете к конкретному контейнеру. Не у всех у них есть оператор[]. Вот захочется Вам завтра сменить вектор на список или на обычный C массив, тогда и вспомните.. что лучше..
Для человека, готового переписывать 100500 printfов при изменении типа в контейнере - это не аргумент. :)
И это при том, что при компиляции, printf даже не пискнет о невалидных типах, нужно будет 100500 раз запускать и проверять как выводится (неделя времени всего). :)


Название: Re: Сортировка массива qsort
Отправлено: Igors от Апрель 11, 2013, 11:16
И это при том, что при компиляции, printf даже не пискнет о невалидных типах, нужно будет 100500 раз запускать и проверять как выводится (неделя времени всего). :)
Даже древний gcc 4.2 отсыпает варнинг

Такие "скромные" циклы for, лучше по-возможности избегать, поскольку Вы себя привязываете к конкретному контейнеру. Не у всех у них есть оператор[]. Вот захочется Вам завтра сменить вектор на список или на обычный C массив, тогда и вспомните.. что лучше..
Ну у обычного массива оператор [] есть :) С итераторами - да, универсальнее, но и более громоздко

Для человека, готового переписывать 100500 printfов при изменении типа в контейнере - это не аргумент. :)
А почему Вы сразу предполагаете какую-то общность и массированное использование? До этого дело доходит относительно редко. Более вероятно что отладочная печать будет убита после того как сыграла свою роль


Название: Re: Сортировка массива qsort
Отправлено: Old от Апрель 11, 2013, 11:20
С итераторами - да, универсальнее, но и более громоздко
и эффективней. Нужно помнить, что каждую итерацию происходит расчет эффективного адреса, вместо простого инкремента для перехода к следующему элементу.

Громоздкости никакой нет, если пользоваться новым стандартом.
 


Название: Re: Сортировка массива qsort
Отправлено: m_ax от Апрель 11, 2013, 14:29
Ну у обычного массива оператор [] есть :)
Аха, есть.. Зато метода size() нет  :(