ci-dessous est le code (inchangé) d'une question que j'ai rencontrée lors de la résolution des questions de HackErkRank:
Mais je ne pouvais pas comprendre 3 lignes que j'ai marquées comme numéro 1,2 et 3 dans le code ci-dessous. P> < P> Comme le programme s'écoule de Main à Func P>
laisse examiner 3 d'abord: p>
Nous passons un nom de fonction lexicographic_sort comme l'un des paramètres de la fonction String_sort. P>
permet maintenant de regarder 1 et 2: p>
dans la fonction string_sort p>
lexicographic_sort est transmis comme int (cmP_func) (const Char A, const char B) * p>
1er doute strong>: Qu'est-ce que cmp_funcC, il n'est pas défini nulle part, est-ce une fonction définie SYTEM? p>
3 Réponses :
La fonction déclarée comme ayant trois paramètres. Le premier est du type alors la fonction où le troisième argument est la fonction qui a le type requis du troisième paramètre de la fonction SO P> 1er doute: qu'est-ce que cmp_func, il n'est pas défini nulle part, est-ce un sytem
fonction définie? p>
blockQuote> La déclaration de la fonction string_sort qui n'est pas une définition pourrait ressembler à p> C'est des noms des paramètres ne sont pas nécessaires. P> Vous pouvez imaginer la définition de la fonction et son appel de la manière suivante p> 2e doute: nous ne transmettons aucun paramètre qui entrerait en char *
A, char * b. Qu'est-ce qui irait à leurs valeurs? P>
blockQquote> c'est la fonction string_sort code> Char ** code>. Le second de type const int code>. Et le troisième du type int (*) (const Char * A, const-B) code> c'est le troisième paramètre est un pointeur sur la fonction qui comporte deux paramètres du type const Char * code> et le type de retour int code>. Ce paramètre est utilisé dans la fonction string_sort code> pour comparer deux chaînes. P> string_sort code> est appelé comme p> lexicographic_sort_éréverse code> déclarée comme p> string_sort code>. Le concepteur de fonction lexicographic_sort code> utilisé comme troisième argument est implicitement converti en pointeur à la fonction. P>
cmP_func code> est le nom PF PF le paramètre de la fonction string_sort code>. Dans une déclaration de fonction, il faut en même temps une définition de fonction des paramètres, doit être présent. P> string_sort code> appelle en elle-même la fonction lexicography_sort code> thyat a été attribué au paramètre cmP_func code> en passant des cordes indiqué par le paramètre arr pour les comparer pendant le tri. Vous devez enquêter sur le corps de la fonction string_sort code>. P> p>
1er doute: qu'est-ce que CMP_Func, il n'est pas défini nulle part, est-ce une fonction définie SYTEM? P> blockQuote>
cmP_function code> n'est pas une fonction système, il s'agit d'un pointeur de fonctionner en C, il est moyen de passer une fonction à une autre fonction (peut être utilisée comme comparateur de tri personnalisé que dans ce cas ou comme rappel dans d'autres cas d'utilisation) P>pour la fonction
Void string_sort (Char ** Arr, const int int len, int (* cmP_func) (const char * a, const char * b)) code> p> p>Il a 3 arguments: P>
arr code>: pointeur sur pointeur sur char p>
len code>: int p>
CMP_FUNCT CODE>: Pointeur sur la fonction que 2 arguments sont les deuxconst char * code> et retourne int. p>Alors, lorsque vous appelez
string_sort code>, vous devez y passer en troisième arguments un pointeur à fonctionner (nom de la fonction ou et avant de cela, cela correspond à ces critères de ces arguments comme Le cas dansint lexicographier_sort_ravever (const char * a, const char * b) code> ettrier_by_number_of_distinct_characters code>. p>.2e doute: nous ne transmettons aucun paramètre qui entrerait en char * A, char * b. Qu'est-ce qui irait à leurs valeurs? P> blockQuote>
Je pense que cette question est répondue maintenant, car elles ne sont pas des arguments à la fonction, ils décrivent les arguments au pointeur de la fonction qui est adopté. P>
Je vous recommande vraiment de lire davantage sur le pointeur sur les fonctions, il y a beaucoup de tutoriels sur Internet. P>
Le but de la fonction lorsque vous appelez Ceci est probablement mieux expliqué par exemple. Supposons string_sort code> est de trier une gamme de chaînes dans un ordre particulier - exactement ce que cette commande est em> dépend de la fonction de fonction qui est transmise en tant que troisième argument. cmp_func code> est un pointeur sur une fonction - la déclaration se lit comme p> string_sort code> , vous passez un concepteur de fonction comme troisième argument - dans ce cas, le nom de l'une de vos fonctions de comparaison. string_sort code> puis appelle em> cette fonction dans le cadre de son fonctionnement et utilise cela pour déterminer comment commander les chaînes dans la matrice. P> string_sort code> est implémentée comme une sorte de tri de bulles uni (en réalité ce ne serait probablement pas, mais cela fonctionne à des fins d'illustration): P> cmp_func Return value String order
-------- ------------ ------------
lexicographic_sort >0 "bar", "foo"
lexicographic_sort_reverse <0 "foo", "bar"
sort_by_number_of_distinct_characters <0 "foo", "bar"
sort_by_length 0 "foo", "bar"
Ce code ne compilera pas.
Hey Harvey, ce n'est pas un code complet, il s'agit d'un aperçu de la question de classement des hackers en utilisant lequel nous devrons remplir. Mais alors je n'ai pas compris ce qu'ils passent dans les lignes 1, 2 et 3
cmp_func code> est le nom du 3ème paramètre et son type est "Pointeur sur une fonction qui accepte deux points de caractères code> char code> et retourneint code>", tout commelen code> est le nom du 2ème paramètre.Hey groo, alors qu'est-ce que le char * a et le char * b qui est transmis à cmp_func?
Au code Numéro 3, nous n'édistissons pas de paramètres avec la fonction, de sorte quelles valeurs a et b prendre des valeurs?
À 3, à l'intérieur du string_sort (), vous pouvez appeler cmP_func () avec ce que vous voulez. Ergo, votre question de quelles valeurs a et b prendre est indistentrique.
compris, merci beaucoup gars tous