Problem z sortowaniem

0

Witajcie, mam pewien problem, a mianowicie muszę skorzystać z qsorta aby posortować tablicę wymiarów [x][3].

Tablica jest wypełniona stringami, wszystko niby jest ok, ale sortuje wg. pierwszej kolumny, a muszę móc określać wg. której kolumny chce sortować. Nie mam żadnego pomysłu jak to dorobić, dlatego też proszę was o pomoc :)

 
int my_compare(const void * a, const void * b)
{

    const char **ia = (const char **)a;
    const char **ib = (const char **)b;
    return strcmp(*ia,*ib);
}

qsort(tablica, 11, 3*sizeof(int *), my_compare);

1

jeśli mowa o C, to jednym z prostszych rozwiązań (ale powtarzającym niestety sporo kodu) będzie coś takiego:

int my_compare_0(const void * a, const void * b)
{
    const char **ia = (const char **)a;
    const char **ib = (const char **)b;
    return strcmp(ia[0],ib[0]);
}
int my_compare_1(const void * a, const void * b)
{
    const char **ia = (const char **)a;
    const char **ib = (const char **)b;
    return strcmp(ia[1],ib[1]);
}
int my_compare_2(const void * a, const void * b)
{
    const char **ia = (const char **)a;
    const char **ib = (const char **)b;
    return strcmp(ia[2],ib[2]);
}

...
switch(sorting_column)
{
  case 0: qsort(tablica, 11, 3*sizeof(int *), my_compare_0);
  case 1: qsort(tablica, 11, 3*sizeof(int *), my_compare_1);
  case 2: qsort(tablica, 11, 3*sizeof(int *), my_compare_2);
}

w C++ można by się pobawić w szablony by zdefiniować wszystkie funkcje porównujące za jednym zamachem:

template <int column> int my_compare(const void * a, const void * b)
{
    const char **ia = (const char **)a;
    const char **ib = (const char **)b;
    return strcmp(ia[column],ib[column]);
}
...
switch(sorting_column)
{
  case 0: qsort(tablica, 11, 3*sizeof(int *), my_compare<0>);
  case 1: qsort(tablica, 11, 3*sizeof(int *), my_compare<1>);
  case 2: qsort(tablica, 11, 3*sizeof(int *), my_compare<2>);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1