qsort mit CArray



  • servus
    mag mir vielleicht mal schnell wer helfen mit qsort? So ganz dürfte ich es nicht begriffen haben.

    und zwar folgendes:
    Ich hab den Datentyp CBookDBStruct den lege ich an, befülle ihn und schmeiss den in eine Liste

    CArray<CBookDBStruct*,CBookDBStruct*> *liste1;
    

    diese Liste1 pappe ich noch mal in eine Liste

    CArray<CArray<CBookDBStruct*,CBookDBStruct*>*,CArray<CBookDBStruct*,CBookDBStruct*>*> m_CollectorList;
    

    jetzt versuche ich die Liste zu sortieren und zwar so:
    Der Aufruf

    qsort(m_CollectorList.GetAt(0),m_CollectorList.GetCount(),sizeof(m_CollectorList),SortTheList);
    

    und die Sortierfunktion

    int SortTheList( const void *arg1, const void *arg2 )
    {
    	CArray<CBookDBStruct*,CBookDBStruct*> *d = (CArray<CBookDBStruct*,CBookDBStruct*>*)arg1;
    	CArray<CBookDBStruct*,CBookDBStruct*> *d1 = (CArray<CBookDBStruct*,CBookDBStruct*>*)arg2;
    	CBookDBStruct *dummy1 = d->GetAt(0);
    	CBookDBStruct *dummy2 = d1->GetAt(0);
    

    leider kommt in die Sortierfunktion nur Müll rein. Mag mir bitte wer sagen wo der Fehler liegt?
    Danke



  • Was spricht gegen die Verwendung von STL 😉



  • Danke für das Interesse...
    ... jetzt kommts raus. Ich habe noch nie mit STL gearbeitet. Ein kurzer Blick in die MSDN verriet mir, daß dies auch keine Umstellung auf ein paar Minuten sein wird sondern schon ein wenig Zeitraubender. Ich würde, wenn es nur irgendwie geht, gern auf dem CArray bleiben.
    Weiß sonst vielleicht jemand was ich da falsch mache?



  • DaDings schrieb:

    servus
    Ich hab den Datentyp CBookDBStruct den lege ich an, befülle ihn und schmeiss den in eine Liste

    CArray<CBookDBStruct*,CBookDBStruct*> *liste1;
    

    Okay, aber warum das Array mit new anlegen?
    Reicht nicht

    CArray<CBookDBStruct*,CBookDBStruct*>
    

    diese Liste1 pappe ich noch mal in eine Liste

    CArray<CArray<CBookDBStruct*,CBookDBStruct*>*,CArray<CBookDBStruct*,CBookDBStruct*>*> m_CollectorList;
    

    Warum ?

    Ich glaube du machst das etwas zu kompliziert. Dein problem ist,
    das du in der Sortierfunktion wild herumcasten must, um deine Daten
    wieder zu bekommen. Entweder gehst du da mit reiner Logik heran, oder
    probierst irgendwelche casts aus, bis es paßt. Das wird aber Nerver kosten!

    Also:
    CArray und qsort funktioniert auf jeden Fall!
    Versuch es so einfach wie möglich zu halten, wegen der Casts!

    Hier ein Bespiel in VC7.1:

    // Sort.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include "Sort.h"
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    #include <afxtempl.h>
    
    // The one and only application object
    
    CWinApp theApp;
    
    using namespace std;
    
    class CBook
    {
    public:
    	CBook(const CString& title):m_title(title){}
    	~CBook(){}
    
    	const CString& Title() const
    	{ return m_title; }
    
    private:
    	CString m_title;
    };
    
    typedef CArray<CBook*, CBook*> CBookArray;
    
    static CString s_titles[] =
    { 
    	_T("Programmieren mit C++"),
    	_T("Programmieren mit MFC"),
    	_T("Programmieren mit C"),
    	_T("Programmieren mit VisualBasic"),
    	_T("Inside Visual C#"),
    	_T("Applications with VB.NET"),
    };
    
    static int SortBooks(const void* arg1, const void* arg2)
    {
    	CBook* b1 = *(CBook**)arg1;
    	CBook* b2 = *(CBook**)arg2;
    
    	return b1->Title().Compare(b2->Title());
    }
    
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    	int nRetCode = 0;
    
    	// initialize MFC and print and error on failure
    	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    	{
    		// TODO: change error code to suit your needs
    		_tprintf(_T("Fatal Error: MFC initialization failed\n"));
    		nRetCode = 1;
    	}
    	else
    	{
    		CBookArray array;
    		for ( int i = 0; i < sizeof(s_titles) / sizeof(s_titles[0]); ++i )
    		{
    			CBook* pNewBook = new CBook(s_titles[i]);
    			array.Add(pNewBook);
    		}
    
    		qsort(array.GetData(), array.GetCount(), sizeof(CBook*), SortBooks);
    
    		// sortierte Liste im Debugfenster ausgeben
    		for ( int i = 0; i < array.GetCount(); ++i )
    		{ TRACE(_T("%s\n"), array.GetAt(i)->Title()); }
    
    		// array Elemente vom Heap löschen
    		for ( int i = 0; i < array.GetCount(); ++i )
    		{ delete array.GetAt(i); }
    
    		// ende des scopes ruft dtor von array auf
    	}
    
    	return nRetCode;
    }
    

    Unter VC6 wird der Code vermutlich probleme machen (s. Compilermeldungen).

    Gruss
    EB



  • Besten Dank für die seeeehr ausführliche Hilfe. Ich hab damit nur ein Problem: Mein Programm hat jetzt ungefäht 1 MB Quellcode, ich kann (naja, können schon) und will(ja, ich will nicht so recht) meine Datenstruktur nicht mehr ändern. Diese Datenstruktur ist einer der Hauptlebensader im Programm. Ich gestehe gerne, daß das Design unter jeder Sau ist, allerdings bin ich ein wenig unter Zeitdruck. Das Programm soll fertig sein im Dezember.... Dezember 2004 wohl gemerkt.

    Also werde ich , wie von dir empfohlen,noch ein wenig herumcasten. Falls ich es nicht hinbekomme, wirds wohl eine eigene(A*****langsame) Sortierfunktion.

    Noch mal Danke


Anmelden zum Antworten