Question

est-ce juste moi ou ce code Perles Programmation est erroné (quicksort veut 2 vides const, non?) Si oui, est mon droit de solution? Toutes mes excuses, juste apprendre ...

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);

Est-ce une solution?

int sortcmp(const void *p, const void *q)
{   return wordncmp(* (char * const *) p, * (char * const *) q);
}
Était-ce utile?

La solution

Le premier exemple de code ne fonctionnera probablement avec pratiquement tous les compilateur et CPU; cependant, il est un comportement techniquement indéfini, si vous suivez la norme C à la lettre.

Comme vous l'avez dit, le dernier argument de pointeur est un qsort() à une fonction qui prend deux arguments de type const void*. Prend des arguments différents sortcmp. Votre compilateur devrait vous donner un avertissement sur les signatures de type incompatible ou quelque chose. Dans tous les cas, une distribution est effectuée à partir d'une fonction d'un type d'une fonction d'un autre type.

La norme C précise que vous pouvez lancer des pointeurs de fonction à d'autres pointeurs de fonction avec différents types, mais vous ne pouvez pas déréférencer et invoquer le pointeur de la fonction casted. Toutefois, si vous REFONTE le pointeur de fonction à son type d'origine, puis en appelant le comportement qui a défini -. Il appelle la fonction originale

Puisque vous d'une coulée à un int (*)(char**, char**) int (*)(const void*, const void*), puis éventuellement invoquer est votre char ** fonction de comparaison sans jeter de nouveau à const, c'est un comportement non défini.

Cependant, étant donné que pratiquement sur toutes les architectures, et un char * const * sont représentés la wordncmp() même, l'appel de fonction sera à peu près toujours travailler.

Si vous voulez obtenir un comportement défini, vous devez vous assurer que votre fonction de comparaison a la signature de type approprié, et vous pouvez jeter les arguments du type approprié. Votre solution est tout à fait correct et ne viole pas la norme C là. Bien fait sur const char* - correct -. Beaucoup de gens ne comprennent pas exactement ce que les moyens void*

Vous devez également prendre des paramètres de <=> <=>, puisque vous n'êtes pas modifier les paramètres.

Side note: Vous pouvez techniquement pas jeter un pointeur de fonction à un pointeur de données (par exemple un <=>) ou vice-versa. La norme permet des pointeurs de fonction et des pointeurs de données pour avoir des tailles différentes. Même si cela fonctionne sur votre ordinateur, il est pas garanti toujours.

Autres conseils

Vous avez raison, la signature ne correspond pas à sortcmp ce qsort attend. Votre correction est juste. Devrait également être wordcmp fait const - correctes, vous perdez techniquement une partie du <=> -. Ness le long du chemin

int wordncmp(const char *p, const char* q)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top