Invalid conversion from 'int' to 'const void*'

Hashimura

Grünschnabel
Hey Leute,
sollen von der Uni qsort() anwenden, nur ich hab da ein problem und komme einfach nicht weiter :(

CSS:
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <math.h>
#include <time.h>
using namespace std;

void fuelle_feld ( double a[], int n, int unten, int oben )                           // Random Zahlen werden erstellt
{
    for(int i = 0 ; i <= n ; i++)
    {
        a[i]= (rand() % (oben-unten+1)+unten)*0.1;
    }
}
void gib_feld_aus ( double a[], int n )                                                      //Random Zahlen werden ausgegeben
{
    int j = 0;
    for(int i = 0 ; i < n ; i++)
    {
        if ( j == 10)
        {
            j=0;
        }
        cout << fixed << setprecision(1) << setw(4) << setfill('0') << a[i] << '\t';
        j++;
    }
}
int tausche_double ( const void *a , const void *b )
{
    return (*(int*)a-*(int*)b);
}

void sortiere_feld_aufsteigend ( double a[], int n )
{
    int i;
    int b;
    qsort((void*)fuelle_feld,200,sizeof(int),tausche_double);
    for(i = 0 ; i < n ; i++)
    {
        gib_feld_aus(a,n);
    }
}

int main()
{
    int n = 200, oben = 100 , unten = 0;
    double a[n];
    int b;

    srand(time(NULL));

    fuelle_feld(a , n, unten, 10*oben);
    gib_feld_aus(a, n);                                                        
    tausche_double(a,b);                                                 //Hier kommt bei mir der fehler (error:invalid conversion from 'int' to 'const void*'
    sortiere_feld_aufsteigend(a,n);
}
Habt ihr vielleicht eine Idee ?

Gruß Hashimura
 

cwriter

Erfahrenes Mitglied
Hi

Bitte nicht Themen mit Fehlermeldungen im Titel erstellen - das ist zu generisch.

Bei dir gibt es mehrere Probleme: Du verlierst durch das casten in tausche_double sehr viel Präzision. Warum machst du es nicht so?
C++:
int tausche_double(const void* a, const void* b) {
if(*((double*)a) < *((double*)b)) return -1;
else if(*((double*)a) > *((double*)b)) return 1;
else return 0;
}

Dann liefert fuelle_feld ja gar nix zurück - das darfst du entsprechend nicht als Parameter verwenden.

Dann ist sizeof(int) beim qsort falsch. Du willst doubles sortieren, und es ist nicht garantiert, dass ein double gleich gross ist wie ein int (tatsächlich ist es meines Wissens unter Windows nicht gleich gross).

In fuelle_feld schreibst du mit i <= n einen Wert zu viel.

So... Fürs Erste sollte das reichen. Wenn du eine Zeilennummer angibst, könnte ich dir wohl auch sagen, welcher Quelle dein Compilerfehler entspringt.

Gruss
cwriter
 

Hashimura

Grünschnabel
Kannst du mir diesen code genauer erklären, komme nicht ganz drauf was er grad macht.
Dank dieser code Sortiert er meine Zahle schön vernüftig :)

C++:
int tausche_double(const void* a, const void* b) {
if(*((double*)a) < *((double*)b)) return -1;
else if(*((double*)a) > *((double*)b)) return 1;
else return 0;
}


Gruß Hashimura
 

cwriter

Erfahrenes Mitglied
Hi

Dank dieser code Sortiert er meine Zahle schön vernüftig :)
Dann hast du aber noch das fuelle_feld aus dem qsort-parameter durch den Pointer auf deinen Array ersetzt, oder?

Der Code macht eigentlich dasselbe wie deiner, nur exakter.
Du hast als Parameter const void* bekommen. Das sagt dir die Funktion. Die Funktion weiss aber selbst nicht, wie gross das Element ist, worauf const void* zeigt. Um dem Compiler das mitzuteilen, musst du auf einen Typ casten. Nun hattest du int genommen. Wir wissen aber, weil wir den Code sehen, dass du eigentlich mit doubles arbeitest. Nun gibt es 2 Probleme:
1) Doubles sind i.d.R. nicht gleich gross wie ints, du verlierst also einen Teil der Daten.
2) Doubles werden völlig anders gerechnet als ints. Im Speicher sieht also 123 völlig anders aus als 123.456.

Selbst wenn 2) nicht zutreffen würde: Ein double zu einem int gecastet rundet nichts. Also z.B. (int)123.456 == 123, aber auch (int)123.999 == 123.

Nun hast du beide Parameter zu int gecastet und voneinander subtrahiert. Das geht gut für Integerwerte, da x = a-b; negativ ist, wenn a < b, 0, wenn a=b und positiv, wenn a > b.

Bei doubles ist es nicht so einfach, da der Rückgabetyp des Callbacks als int vorgeschrieben ist. Einfach a-b=x zu rechnen geht somit nicht, da z.B. x=0.9 durch die Konvertierung zum Integer auf 0 fallen würde - der Sortieralgorithmus würde also bei den drei Werten 0.3, 0.5, 0.9 irgendeine Reihenfolge ausspucken, denn es sind ja alle gleich (int)0.

Mein Code macht im Prinzip nur folgendes: Er überprüft zuerst, ob a < b ist (also ob a - b < 0 wäre). Und wenn dies der Fall ist, wird einfach eine negative Zahl zurückgegeben. (Negativ heisst: a kommt vor b, 0 heisst gleichwertig, positiv heisst a nach b)

Und analog für die anderen beiden Fälle. So wird sichergestellt, dass keine Rundungsfehler auftreten, die die Reihenfolge verändern können.

Gruss
cwriter