0
votes

Paramètre passant dans des fonctions en C langue?

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> Comme le programme s'écoule de Main à Func

laisse examiner 3 d'abord:

Nous passons un nom de fonction lexicographic_sort comme l'un des paramètres de la fonction String_sort.

permet maintenant de regarder 1 et 2:

dans la fonction string_sort

lexicographic_sort est transmis comme int (cmP_func) (const Char A, const char B) *

1er doute : Qu'est-ce que cmp_funcC, il n'est pas défini nulle part, est-ce une fonction définie SYTEM?

2e doute : nous ne transmettent aucun paramètre qui irait en char * a, char * b. Qu'est-ce qui irait à leurs valeurs? xxx

c

7 commentaires

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 est le nom du 3ème paramètre et son type est "Pointeur sur une fonction qui accepte deux points de caractères char et retourne int ", tout comme len 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


3 Réponses :


0
votes

La fonction string_sort xxx

déclarée comme ayant trois paramètres. Le premier est du type Char ** . Le second de type const int . Et le troisième du type int (*) (const Char * A, const-B) c'est le troisième paramètre est un pointeur sur la fonction qui comporte deux paramètres du type const Char * et le type de retour int . Ce paramètre est utilisé dans la fonction string_sort pour comparer deux chaînes.

alors la fonction string_sort est appelé comme xxx < / pré>

où le troisième argument est la fonction lexicographic_sort_éréverse déclarée comme xxx

qui a le type requis du troisième paramètre de la fonction string_sort . Le concepteur de fonction lexicographic_sort utilisé comme troisième argument est implicitement converti en pointeur à la fonction.

SO

1er doute: qu'est-ce que cmp_func, il n'est pas défini nulle part, est-ce un sytem fonction définie?

cmP_func est le nom PF PF le paramètre de la fonction string_sort . Dans une déclaration de fonction, il faut en même temps une définition de fonction des paramètres, doit être présent.

La déclaration de la fonction string_sort qui n'est pas une définition pourrait ressembler à xxx < / Pré>

C'est des noms des paramètres ne sont pas nécessaires.

Vous pouvez imaginer la définition de la fonction et son appel de la manière suivante xxx blockquote>

2e doute: nous ne transmettons aucun paramètre qui entrerait en char * A, char * b. Qu'est-ce qui irait à leurs valeurs?

c'est la fonction string_sort appelle en elle-même la fonction lexicography_sort thyat a été attribué au paramètre cmP_func 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 .


0 commentaires

0
votes

1er doute: qu'est-ce que CMP_Func, il n'est pas défini nulle part, est-ce une fonction définie SYTEM?

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

pour la fonction Void string_sort (Char ** Arr, const int int len, int (* cmP_func) (const char * a, const char * b))

Il a 3 arguments:

arr : pointeur sur pointeur sur char

len : int

CMP_FUNCT : Pointeur sur la fonction que 2 arguments sont les deux const char * et retourne int.

Alors, lorsque vous appelez string_sort , 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 dans int lexicographier_sort_ravever (const char * a, const char * b) et trier_by_number_of_distinct_characters . .

2e doute: nous ne transmettons aucun paramètre qui entrerait en char * A, char * b. Qu'est-ce qui irait à leurs valeurs?

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é.

Je vous recommande vraiment de lire davantage sur le pointeur sur les fonctions, il y a beaucoup de tutoriels sur Internet.


0 commentaires

0
votes

Le but de la fonction 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> xxx pré>

lorsque vous appelez 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>

Ceci est probablement mieux expliqué par exemple. Supposons 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"


0 commentaires