Question

S'il vous plaît dites-moi ce que l'appel à la fonction donnée retournera et comment? Le code:

typedef struct {
    int size;
    ptrdiff_t index;
    void (*inlet) ();
    int argsize;
    ptrdiff_t argindex;
} CilkProcInfo;


/*
 * Returns a pointer to the slow version for a procedure
 * whose signature is p.
 */

/* the function definition is - */
static void (*get_proc_slow(CilkProcInfo *p)) () {
     return p[0].inlet;
}

/*The function gets called as -*/
   (get_proc_slow(f->sig)) (ws, f);
/*where f->sig is a pointer to CilkProcInfo struct*/
Était-ce utile?

La solution

Dans votre structure CilkProcInfo , entrée est un pointeur sur une fonction qui prend un nombre non spécifié d'arguments et ne renvoie pas de valeur, comme void foo (); .

Dans la ligne

(get_proc_slow(f->sig)) (ws, f);

l'appel get_proc_slow (f-> sig) renvoie ce pointeur de fonction, il est donc équivalent à

(f->sig[0].inlet) (ws, f);

Donc si votre f- > sig [0] .inlet pointe vers la fonction foo () , cela équivaut à l'appel

foo (ws, f);

Je dois admettre que la syntaxe statique (* get_proc_slow (CilkProcInfo * p)) () {... m’est un peu inconnue.

Autres conseils

get_proc_slow () renvoie un pointeur de fonction de type void (*) () que le code appelle ensuite. Alors quand tu fais:

(get_proc_slow(f->sig)) (ws, f);

C'est fondamentalement la même chose que de faire:

void (*fptr)() = get_proc_slow(f->sig);
fptr(ws, f);

On dirait que c'est une fonction qui renvoie un pointeur sur une fonction dont la valeur de retour est void sans paramètre ( void (*) () ) et qui accepte un pointeur sur une structure CilkProcInfo en tant que paramètre. Cependant, je ne sais pas pourquoi vous auriez besoin de la construction p [0] .inlet . Ne pourriez-vous pas simplement le renvoyer sous p- > entrée ?

Oh oui, et get_proc_slow est le nom de la fonction qui renvoie le pointeur de la fonction.

static void (*get_proc_slow(CilkProcInfo *p)) () {
     return p[0].inlet;
}

Lecture du nom en respectant les règles de grammaire: get_proc_slow est une fonction (avec une liaison interne) qui prend un pointeur sur une structure CilkProcInfo et renvoie un pointeur sur une fonction prenant des arguments non spécifiés et ne renvoyant aucune valeur ( void ).

(get_proc_slow(f->sig)) (ws, f);

Cette instruction appelle get_proc_slow avec un paramètre approprié ( f- & sig est un pointeur sur un CilkProcInfo ), puis utilise le renvoyer une valeur (un pointeur sur une fonction) pour appeler cette fonction avec ws et f comme arguments.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top