void*



  • Hi,

    wer kann mir weiterhelfen?

    ich erhalte bei folgendem Pogrammabschnitt immer eine Fehlermeldung:

    [code]

    void bubblesort_2(void* feld, size_t anzahl,size_t width, int (*fncompare)(void*, void*))
    {
    int i,j,swapped;
    i=anzahl;
    do
    {
    swapped=FALSE;
    for(j=0;j<i-1;j++)
    {

    if ((*fncompare)(&feld[j],&feld[j+1]) >0) ***<-hier


    {
    swap2(feld,j,j+1);
    swapped=TRUE;
    }
    }
    i--;
    }while(swapped);
    }

    mfg
    pierre

    [/code]



  • Nachtrag:

    Fehlermeldung : 2-mal : Unbekannte Größe

    mfG
    pierre



  • void-Zeiger kann man nicht dereferenzieren. Du musst zB mit char* arbeiten und immer um 'width' Stellen vorrücken, wenn Du es gerne so allgemein hast (oder ein Makro nehmen).



  • @Daniel E,

    vielen Dank;

    insbesondere mit der Idee, den Char-typ zu verwenden.

    Damit klappt es hervorragend.

    mfg
    pierre



  • hi,

    ich habe in diesem Zusammenhang die nächste Frage:

    Warum funktioniert die Dereferenzierung von void* problemlos mit GNU-Compiler
    der DEV-C++-IDE, während der Microsseft-Compiler mir Fehler anzeigt????

    Meinen Quelltext habe ich in dieser Form schon mal gesehen u.z.

    [url]
    wwww.physik.uni-magdeburg.de/studium/edverg/ckurs/script/node46.html
    [/url]

    Warum geht es mal so und mal so nicht??

    mfg
    pierre



  • wenn der GCC das dereferenzieren von void* erlaubt, dann liegt er falsch.

    probiers mal mit
    -std=c99 -pedantic
    zusätzlich in der commandozeile - dann sollte er es nicht mehr akzeptieren.

    das Problem bei einem void* ist, dass er keine definierte größe hat.

    soll er jetzt also 1 Byte, 2 Byte oder gar 10 Byte nehmen? er weiß es nicht. (niemand weiß es)

    für 1 Byte Zeiger gibt es char*



  • Hi,

    nur warum ist dies zulässig:

    in der <stdlib.h> qsort:

    void qsort ( void * base,
    size_t num, size_t width,
    int (*fncompare) (const void *, const void 😉 ); ??

    ich blick da noch nicht durch.

    mfG
    pierre



  • was ist daran unverständlich?



  • Hi,

    das erste Argument ist doch auch void* base, d.h. ein Pointer auf ein Array;
    dies muss doch auch dereferenziert werden, um damit weiter arbeiten zu können.

    mfg
    pierre



  • Original erstellt von <du_c>:
    *das erste Argument ist doch auch void base, d.h. ein Pointer auf ein Array;
    dies muss doch auch dereferenziert werden, um damit weiter arbeiten zu können.
    **

    lies mal die Doku zu qsort.

    mit width (oder of auch size genannt) gibst du die größe eines 'Objektes' an.

    in qsort wird dann mit char* gearbeitet um immer exakt width bytes weiter zu gehen.

    void* wird deshalb verwendet, weil sich jeder zeiger in einen void* umwandeln lässt, ohne explizit casten zu müssen (ausserdem wäre es semantisch falsch char* zu verwenden)


Anmelden zum Antworten