std::sort mit structure geht nicht, qsort soll man nicht - wie dann?



  • Hallo,

    ich versuche ein array mit einer eigens definierten structure zu sortieren,
    mit std::sort kann ich nicht und qsort sollte man nicht verwenden....kann mir jemand helfen?

    Mein versuch:

    qsort(	(void *) myarr, 
    		   	myarr_elements, 
    	 		sizeof(MM_DATA), 
    			&MyClass::Compare);
    
    //die Compare
    int 
    MyClass::Compare(const void *a, const void *b)
    {
    	MM_DATA *ma,*mb;
    
    	ma = (MM_DATA *) a;
    	mb = (MM_DATA *) b;
    
    	if (ma->i <  mb->i) return(-1);
    	if ((ma->i == mb->i) && (ma->j < mb->j)) return(-1);
    	if ((ma->i == mb->i) && (ma->j == mb->j)) return(0);
    	return(1);
    } 
    
    //meine MM_DATA struktur:
    
    struct MM_DATA 
    {
    	int i; 			
    	int j; 			
    	double val; 	
    };
    

    Als Fehlermeldung bekomme ich so:

    Fehler: »int (MyClass::)(const void, const void*)« kann nicht nach »int ()(const void, const void*)« für Argument »4« nach »void qsort(void*, size_t, size_t, int ()(const void, const void*))« umgewandelt werden

    Danke euch



  • Erstens: Was meinst du mit "std::sort() kann ich nicht verwenden"? Ist es verboten für die Anwendung oder kommst du damit nicht zurecht?

    Zweitens: Die Vergleichsfunktion für qsort() muß eine globale Funktion oder statische Methode sein, bei einer normalen Methode gibt es Probleme, den this-Zeiger zuzuordnen.



  • zu std::sort()

    ich kann doch std::sort() nicht mit einem structure - gefüllten elemente aufrufen...bei mir kommt als fehler:

    Fehler: keine passende Funktion für Aufruf von »sort(MM_DATA*&, int&)«
    


  • Wie hast du denn sort() aufgerufen? Richtig wäre:

    MM_DATA mein_array[len];
    sort(mein_array,mein_array+len);//erwartet, die Elemente per (überladenen) op< vergleichen zu können
    
    sort(mein_array,mein_array+len,comparer);//erwartet, daß comparer() mit zwei MM_DATA's aufgerufen werden kann
    //und etwas bool'sches zurückliefert - also bool comparer(const MM_DATA&,const MM_DATA&); - als globale Funktion
    

Anmelden zum Antworten