Frage

ist es nur mich oder dieser Code in Pearls Programmierung falsch ist (quicksort will 2 const Hohlräume, nicht wahr?) Wenn ja, ist meine Lösung richtig? Entschuldige bitte, nur zu lernen ...

int wordncmp(char *p, char* q)
{   int n = k;
    for ( ; *p == *q; p++, q++)
        if (*p == 0 && --n == 0)
            return 0;
    return *p - *q;
}

int sortcmp(char **p, char **q)
{   return wordncmp(*p, *q);
}
...

qsort(word, nword, sizeof(word[0]), sortcmp);

Ist das eine Lösung?

int sortcmp(const void *p, const void *q)
{   return wordncmp(* (char * const *) p, * (char * const *) q);
}
War es hilfreich?

Lösung

Das erste Codebeispiel wird wahrscheinlich mit nahezu jedem Compiler und CPU arbeiten; es ist jedoch technisch nicht definiertes Verhalten, wenn Sie den C-Standard zu befolgen.

Wie Sie sagten, das letzte Argument zu qsort() ist ein Zeiger auf eine Funktion nimmt zwei Argumente vom Typ const void*. sortcmp nimmt verschiedene Argumente. Ihr Compiler sollte geben Sie eine Warnung über nicht kompatiblen Typ Signaturen oder so etwas. In jedem Fall wird ein gegossener aus einer Funktion von einem Typ in einer in Abhängigkeit von einer anderen Art durchgeführt wird.

Der C-Standard legt fest, dass Sie Funktionszeiger auf andere Funktionszeiger mit verschiedenen Arten werfen können, aber Sie können die gegossenen Funktionszeiger nicht dereferenzieren und aufrufen. Wenn Sie jedoch den Funktionszeiger wieder auf seine ursprüngliche Art wieder gegossen, dann ruft dieses definiertes Verhalten hat -. ruft die ursprüngliche Funktion

Da man von einem int (*)(char**, char**) zu einem int (*)(const void*, const void*) sind Gießen, und dann schließlich wird qsort() Ihre Komparatorfunktion aufrufen, ohne es zurück zu int (*)(char**, char**) zu Gießen, das ist nicht definiertes Verhalten.

Da jedoch praktisch auf allen Architekturen, ein char ** und ein const void* die gleiche Art und Weise dargestellt werden, wird der Funktionsaufruf ziemlich immer arbeiten.

Wenn Sie definiertes Verhalten zu bekommen, müssen Sie sicherstellen, dass Ihre Komparatorfunktion die richtige Art Signatur hat, und dann können Sie die Argumente auf den richtigen Typ umgewandelt. Ihre Lösung ist genau richtig und verstößt nicht gegen den C-Standard gibt. Gut gemacht auf const-Korrektheit -. Eine Menge Leute nicht genau verstehen, was char * const * Mittel

Sie sollten auch wordncmp() nehmen Parameter const char* machen, da Sie nicht die Parameter zu ändern.

Side Hinweis: Sie können auch technisch nicht einen Funktionszeiger auf einen Datenzeiger werfen (zum Beispiel eines void*) oder umgekehrt. Der Standard ermöglicht Funktionszeiger und Datenzeiger verschiedene Größen zu haben. Auch wenn es auf Ihrem Computer funktioniert, ist es nicht garantiert immer.

Andere Tipps

Sie sind richtig, die Signatur für sortcmp nicht übereinstimmt, was qsort erwartet. Ihre Korrektur ist richtig. wordcmp sollte auch const-correct gemacht werden, wie Sie technisch auf dem Weg einige der const-ness verlieren.

int wordncmp(const char *p, const char* q)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top