[MFC VC6.0] qSort zle wskaźniki?

0

MFC dla VC 6.0

Szukam sposobu wykorzystania QSORT dla sortowania struktury.
Ale albo coś żle adresuje, albo czegoś nie kumam.

Już chciałem zlikwidować statica ale nie udaje się mi to.
Ale po kolei, kod:

Definicja, także struktury:

	static int  compare( const void *arg1, const void *arg2 );

struct record
	{
		char komentarz[256];
	};
	record *Moja_record;
int MojaProcka::compare( const void *arg1, const void *arg2 )
{
	record *my1  = (record*) arg1;
	record *my2  = (record*) arg2;

	TRACE2 ("%s\n%s",my1->kategoria,my2->kategoria);
	
	return strcmp(my1->kategoria,my2->kategoria);
}

bool MojaProcka::Sortuj()
{
	Moja_record = (record *)malloc((unsigned long)500 * sizeof( record )); 

	qsort((void*)Moja_record,500,sizeof(record), 
		(int(*)(const void*, const void*))MojaProcka::compare);

	free( (void *)Moja_record);

	return (true);
}

No coś nie chodzi.
Brak sortowania.
Czy żle ustawiam adresowanie na wskażnikach?

Inna sprawa, żę TRACE nie wyświetla mi komunikatów w debugerze
(a może w staticu nie można używać Trace ?).
Chciałem dać MessageBox(), ale static mi na to nie pozwala.

Czy idzie dla "static int compare" zlikwidować static ?
Aby było tylko "int compare"

Proszę o ocenę tego wskażnika:

                 (int(*)(const void*, const void*))MojaProcka::compare);

Pomożecie [???]

OF: ciekawe czy admin wrzuci to do newbie?

0

Sorki, ale wszystko jest ok, miałem błąd gdzieś indziej ;-P

można uprościc:

       qsort((void*)Moja_record,500,sizeof(record), 
                compare);

Tylko, że sortowanie trwa długo, jest coś szybszego?

0
  1. jesli aktywny, trace moze spowalniac
  2. porownujesz stringi.. to jest ciezka operacja - qsort jest pesymistycznie kwadratowy, wiec jak masz pecha, to porownan jest wiele i trwa dlugo.. jesli wpadasz w pechowy przypadek, pozostaje uzyc innego algo sortowania. jesli danych masz wiele i dlatego sie dluzy - no sorry.. to juz tylko pozostaje sprytne indeksowanie albo pilnowanie zeby nigdy nie sortowac a raczej trzymac dane zawsze posortowane i inteligentnie wstawiac nowe dane do struktury..
0

Fakt, Trace zostawiłem.... i tym tropem:

Stringów dla 20tys. idzie szybko, no problem.
Ale już 400tys. to jest odczuwalny delay.
Tylko, że na wersji Debug. Releace idzie ok [browar]

0

takie głupie pytanie. Używasz MFC, czyli C++, więc dlaczego uparłeś się na qSort-a zamiast skorzystać z STL-owego std:sort?
qSort jest nieporęczny i wolniejszy.

0
pajero napisał(a)

Definicja struktury:

struct record
	{
		char komentarz[256];
	};
	record *Moja_record;

Ta moja struktura ma jeszcze z 10 innych składników. Funkcja sort nie podmieni mi wskażników przy sortowaniu w "Moja_record".
No chyba, że znowu mam niedowiedzę 8-O

0

Ta moja struktura ma jeszcze z 10 innych składników. Funkcja sort nie podmieni mi wskażników przy sortowaniu w "Moja_record".

hm? masz na mysli ze 'wyniku' sortowania nie 'zapisze' z powrotem w tej tablicy? oj, to cos Ci sie pomieszalo.. sort modyfikuje kolekcje ktore jej podasz do posortowania
http://www.cplusplus.com/reference/algorithm/sort.html
mowiac lopatologicznie, inaczej sort musialby cos zwracac, prawda..? :)

tak wiec majac:

int* tablica[50]
std::sort(tablica, tablica + 50, &fporownujaca );

sprawi, ze wskazniki zawarte w 'tablica' "sie posortuja" wg. przykazan podanej funkcji porownujacej..

btw. w tym kodziku ktory wlasnie podales, sortowac bedziesz nie tablice wskaznikow a tablice (dynamiczną) struktur.. gdzie wiec chcialbys tam miec podmiane wskanzikow? :/

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