Kleine Proleme mit Qsort und Algorithmus-Idee



  • die cmp-func nimmt Elemente, die sortiert werden, als Parameter. In deinem Fall erwartet sie halt eine struct-variable.

    machse halt:

    ...strcmp(strvar.name, ...);
    


  • ich dachte genau das mit dem aufruf

    int cmp (const buero *ptr1, const buero *ptr2) 
    { 
    return strcmp(*(ptr1).name,*(ptr2).name); 
    }
    

    gemacht zu haben, denn buero ist ja gerade die struct variable und ptr1 und ptr 2 sind pointer auf buero oder nicht??
    😕
    Aber aus irgendeinem grund komme ich nicht an das ".name" von buero ran...



  • . bindet stärker als *
    floglich liest der compiler
    *(ptr).name
    wie

    *(ptr.name)

    was das selbe wie
    ptr.name[0]
    ist

    du musst aber ptr dereferenzieren:

    (*ptr).name
    oder einfacher
    ptr->name



  • *klatsch_vor_kopf*
    natürlich, das wird es sein. Ich werds morgen nachmittag mal ausprobieren

    Naja ist alles n bisschen schwierig als Neueinsteiger, ich hoffe ja mal das mit zunehmender Erfahrung solche Fehler weniger werden. 🙄



  • Ich hab ein ähnlich geartetes Problem: habe auch ein Array aus Structs nach Namen zu sortieren, nur komm ich mit dem Funktionsaufruf von qsort nicht zurande. Ich bekomm immer die Fehlermeldung:

    *Konvertierung des Parameters 4 von 'int (const struct USER *,const struct USER *)' in 'int (__cdecl *)(const void *,const void )' nicht moeglich

    Die Hilfe von VC++ ist bei diesem Problem leider nicht wirklich aussagekräftig... 😞

    Kann mir da jemand mit dem richtigen Funtionsaufruf helfen? 🙂



  • hmm von c++ hab ich leider keine Ahnung.
    Mein Problem bleibt aber bestehen:
    ich hab diese compare funktion und diesen Quicksortaufruf:

    int cmp (const buero *ptr1, const buero *ptr2)
    {
    return (strcmp( ptr1->name,ptr2->name));
    }
    
    int quicksort_name (buero array[],int max)
    {
    qsort(array,max,sizeof(array[0]),cmp);
    }
    

    dabei ist buero die struct mit dem Namen als String drin, die typedefs sehen so aus:

    typedef char String[30];
    typedef struct
    	{
    	char gebaeude;
    	int ebene;
    	int raum;
    	unsigned telefonnr;
    	String name;
    	} buero;
    

    der Compiler meldet mir nun :
    "passing argument 4 of 'qsort' from incompatible pointer type"
    Irgendjemand ne Idee was ich jetzt noch falsch gemacht haben könnte? ich find nirgendwo in ordentliches Beispiel zu qsort und verstehs einfach nicht



  • Zeiger waren zwar nie mein Fachgebiet, aber in der MSDN steht folgende Beispiel compare funktion zu qsort:

    int compare( const void *arg1, const void *arg2 )
    {
       /* Compare all of both strings: */
       return _stricmp( * ( char** ) arg1, * ( char** ) arg2 );
    }
    

    evtl funzt Deines ja wenn Du es ähnlich machst:

    int cmp (const void *ptr1, const void *ptr2) 
    { 
       return (strcmp( * ( buero ** ) ptr1->name, * ( buero ** ) ptr2->name)); 
    }
    

    Wie gesagt, da ich mit Pointern auf Kriegsfuss stehe, handelt es sich hierbei nur um ein ansehen, vergleichen und umbasteln. Testen konnte ich es hier mangels compiler nicht.

    *edit*

    int cmp (const void *ptr1, const void *ptr2)  
    {  
       return (strcmp( (* ( buero** ) ptr1)->name, (* ( buero ** ) ptr2)->name));  
    }
    

    Damit gelingt mir zumidest das kompilieren, erhalte aber trotzdem noch eine Zugriffsverletzung



  • Vielleicht liegts ja daran, was strcmp() zurückliefert? 😉

    Wie sieht eigentlich die Syntax von qsort() aus? Kann da mal jemand was aus der Doku posten, damit auch weiß was die Funktion braucht und zurückliefert?



  • wer hat denn ne url zu einer guten (vielleicht sogar offiziellen) Dokumentation, dann such ich den Kram raus!



  • Ich denke mal eine Acces Violation wird kaum geschmissen wenn man lediglich nen Falschen Rückgabewert hat... Meines Wissens kommt Die doch bei eben solchen Dingen wie falscher Herumzeigerei...


Anmelden zum Antworten