qsort sortiert nicht



  • Hallo!

    Irgendwie krieg ich qsort nicht dazu mein Array mit longs zu sortieren.
    Im Array stehen unsortierte long werte, und wenn ich das array nach dem qsort aufruf wieder ausgebe, sind diese immer noch genauseo unsortiert und in derselben reihenfolge.

    Ich hab nun ein kleines Testprogramm geschrieben, dass sich genauso verhält.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    long *arrLong;
    
    int compare(const void *a, const void *b){
        const long *ea,*eb;
        ea = (long *) a;
        eb = (long *) b;
        if (ea == eb) {return 0;}
        if (ea < eb) {return -1;}
        return 1;
    } 	
    
    int main(int argc, char** argv) {
    
    	int i = 0;
    
    	/* Initialisierung */
    	if((arrLong = (long *) malloc (sizeof(long))) == NULL) {
       		fprintf(stdout,"Cannot allocate memory");	
    	}
    
      	arrLong[0]= 5;
    
     	if((arrLong = (long *) realloc (arrLong, sizeof(long) * (sizeof(arrLong) + sizeof(long)))) == NULL) {
        	fprintf(stdout,"Cannot reallocate memory");
     	}
    
      	arrLong[1]= 4;
    
     	if((arrLong = (long *) realloc (arrLong, sizeof(long) * (sizeof(arrLong) + sizeof(long)))) == NULL) {
        	fprintf(stdout,"Cannot reallocate memory");
     	}
      	arrLong[2]= 3;
    
     	if((arrLong = (long *) realloc (arrLong, sizeof(long) * (sizeof(arrLong) + sizeof(long)))) == NULL) {
        	fprintf(stdout,"Cannot reallocate memory");
     	}
      	arrLong[3]= 6;
    
     	if((arrLong = (long *) realloc (arrLong, sizeof(long) * (sizeof(arrLong) + sizeof(long)))) == NULL) {
        	fprintf(stdout,"Cannot reallocate memory");
     	}
    
    	qsort(arrLong,sizeof(arrLong)/sizeof(arrLong[0]),sizeof(arrLong[0]), compare);
    
    	for(i=0; i<sizeof(arrLong);i++){
    		fprintf(stdout,"%li\n",arrLong[i]);
    
    	}
    
    	return 0;
    }
    

    Falls wer einen Hinweis hätte wäre ich sehr dankbar.

    LG max



  • if (*ea == *eb) return 0;
    


  • realloc ganz falsch genutzt, außerdem vermisse ich ein free in deinem Code

    1. wenn realloc NULL zurückliefert, verlierst du den ganzen Speicher
    2. sizeof(arrLong) ist immer gleich, egal wie viele Elemente dein Array hat, denn arrLong ist ein Pointer

    int main(...)
    {
        long *tmp;
        int len = 0;
    
        /* Initialisierung */
        if((arrLong = (long *) malloc (sizeof(long))) == NULL) {
               fprintf(stdout,"Cannot allocate memory");
               return 1; /* sonst gibt es ein schönes SegFault ;) */
        }
    
        arrLong[len++]= 5;
    
        tmp = realloc(arrLong, sizeof(long)*(len + 1);
        if(tmp == NULL) /* Kein Speicher frei, Array aber noch vorhanden */
        {
           fprintf(stderr, "Cannot reallocate memory --> cannot insert a new value\n");
        } else {
          arrLong = tmp;
          arrLong[len++] = 4;
        }
    
        ...
    
        qsort(arrLong,len, sizeof(long), compare);
    
        for(i=0; i<len;i++){ 
            fprintf(stdout,"%li\n",arrLong[i]);
        }
    
        free(arrLong);
        return 0;
    }
    

    Nochmal, sizeof(arrLong)/sizeof(arrLong[0]) geht nur mit Arrays, nicht mit Zeigern.

    Und in deiner compare Funktion vergleichst du die Adressen der Pointer und nicht das, worauf sie zeigen, wie keksekekse dich drauf hingewiesen.



  • supertux schrieb:

    Nochmal, sizeof(arrLong)/sizeof(arrLong[0]) geht nur mit Arrays, nicht mit Zeigern.

    Dann solltest du im Code aber auch nicht von Arrays reden 😉



  • Tim schrieb:

    supertux schrieb:

    Nochmal, sizeof(arrLong)/sizeof(arrLong[0]) geht nur mit Arrays, nicht mit Zeigern.

    Dann solltest du im Code aber auch nicht von Arrays reden 😉

    und wo habe ich das getan? Ich hab lediglich max_raymans Code verbessert. Außerdem finde ich, dass man auch den Heap-Speicher als Array bezeichnen kann, denn es wird auch sequentiell angelegt und anschaulich immer noch ein Array, bloß über einen Zeiger zugreifbar.


Anmelden zum Antworten