void pointer problem



  • Hallo, alle zusammen. Ich soll eine eine Sortierfunktion ähnlich der qsort() schreiben. Der Sortieralgorithmus konnte dabei frei gewählt werden. Das Problem ist, dass der Compiler eine Fehlermeldung bei dem Tauschvorgang bringt.

    2 x "Als linker Operand einer Zuweisung wird L-Wert erfordert"
    an den Stelle "list+(j*size) = list+(i*size);" und "list+(i*size) = tmp;"

    Durch zwischen Ausgaben der Adressen, konnte ich zumindest feststellen das mit den richtigen Daten gearbeitet wird. Ich hoffe einer von euch hat einen Tipp, wie ich das Problem lösen kann.

    void MYsort( void *list, int anzahl, int size, int(*compar)(const void *, const void *) )
    {
      int i, j;  
      void * tmp;
      tmp = malloc(size);
    
      for ( i = 0 ; i < anzahl-1 ; i++ )
        for ( j = i+1 ; j < anzahl ; j++ )
          if ( compar(list+(i*size),list+(j*size)) > 0 )
          {
            tmp           = list+(j*size);
            list+(j*size) = list+(i*size);
            list+(i*size) = tmp;
          }  
    }
    

    Aufgerufen wird die Funktion mit:

    MYsort( cur_data, anz,  sizeof(tcur),  vCmp[atoi(argv[1])] );
    


  • du musst den zeiger erst in ein char (oder was anderes mit 1 byte) umwandlen.
    mit void pointern kann man keine arithmethik betreiben. ebenfalls kannst du
    in der schleife die daten auch nicht per zuweisung kopieren, da bei der dereferenzierung void rauskommt, was nicht erlaubt ist. hier bietet sich
    memcpy an, die funktion ist auf vielen systemen extrem optimiert, manchmal auch
    mit SSE geschrieben, d.h. es gibt keine performance-probleme.

    außerdem löschst du tmp nie 😉



  • Vielen Dank. Ich habe jetzt das memcpy eingebaut und es funktioniert so wie es soll und tmp wird jetzt auch gelöscht ;).


Anmelden zum Antworten