problem z qsort

0

Witam. Mam następujący problem. Mam strukture zadeklarowaną tak:

struct wiersz
{
    string kolumna1;
    string kolumna2;
    string kolumna3;
};

Następnie licze sobie linie w moim pliku, i alokuje dynamicznie pamięć:

    wiersz *TabelaSort;
    TabelaSort = new wiersz[IloscLinii];

Potem kolejno do TabelaSort[i].kolumna1, TabelaSort[i].kolumna2, TabelaSort[i].kolumna3, wczytuje sobie dane z pliku, i chcę tą tabelę posortować wg wybranej przez usera kolumny. Mam to zrobić funkcją qsort. I tu zaczynają się schody. Na próbę chciałem posortować pierwszą kolumnę.

qsort(TabelaSort.kolumna1, IloscLinii, sizeof(TabelaSort[0].kolumna1), SortujRosnaco);

porównywarka:

    int SortujRosnaco(const string * arg1, const string * arg2)
    {
        return (strcmp(*((char**)arg1),*((char**)arg2)));
    }

Kompilator przyczepił się do qsorta a dokładnie TabelaSort.kolumna1. No więc chciałem przekopiować po kolei każdą kolumne do tablicy stringów i to podstawić do qsort. Zrobiłem to tak:

    string *kolumna1t=new string[IloscLinii];

    for(int i=0; i<IloscLinii; i++)
    strcpy(kolumna1t[i], TabelaSort[i].kolumna1);

ale tu również nieznany mi błąd. Co robie źle? Proszę o pomoc.

0

Pierwszy link w wyszukiwarce: http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/
Masz sortować tablicę i jako pierwszy parametr masz podać wskaźnik do początku tablicy struktur, a ty podajesz do pola, powinno być samo TabelaSort. Ilość linii jest oki, ale dalej ma być sizeof(wiersz). Komparator ma przyjmować wskaźniki i rzutować je na typ wiersz. Teraz mając dwie struktury wiersz w komparatorze, w zależności od wyboru użytkownika porównujesz odpowiednią kolumnę, już jako porównanie stringów.

0

int SortujRosnaco(const string * arg1, const string * arg2)
{
return (strcmp(((char**)arg1),((char**)arg2)));
}
Aaargh...
jak gdzieś chcesz napisać takiego potworka *((char**)) to na 99% robisz coś źle.
zwłaszcza że to jest po prostu źle. jeśli chcesz ze stringa otrzymać char* to robisz arg1.c_str().

0

Dzięki bardzo za pomoc, uporałem się już z tym problemem, mam kolejny tym razem banał z którym jednak nie moge sobie poradzić. Jak w danym stringu znaleźć inny? To znaczy mam string1 i string2 i jeżeli w stringu2 znajde string1 to wykonuje jakieś operacje a jak nie znajde to inne?

0

string::find -> http://www.cplusplus.com/reference/string/string/find/

Plus: dlaczego używasz qsort a nie std::sort?

0

qsort to wymóg prowadzącego. Bałem sie czy sie nie wkopałem że oparłem program na stringach ale qsort ładnie to łyknął ;) BTW. kolejny problem. Stosuje find i sprawdzam czy element z tablicy kolumna1t znajduje się w odpowiednim miejscu w tablicy TabelaNie:

            for(int i=0; i<IloscLinii; i++)
                if(TabelaNie[i].find(kolumna1t[i+1], 0))
                kolumna1t[i+1]=TabelaNie[i].c_str();

Kompilacja bez błędów ale prgram kończy działanie crashem

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