Entonces, el código a continuación se puede usar para pasar una función como parámetro:

void printNumber(int nbr)
{
    printf("%d\n", nbr);
}

void myFunction(void (*f)(int))
{
    for(int i = 0; i < 5; i++)
    {
        (*f)(i);
    }
}

int main(void)
{
    myFunction(printNumber);
    return (0);
}

Pero, ¿cómo puedo cambiar ese código para que el entero para "printNumber" se defina fuera de "myFunction"? En otras palabras, solo quiero llamar a la función "myFunction" por x número de veces con el mismo número entero.

Escribí algunos pseudocódigo para explicar lo que estoy tratando de lograr:

void printNumber(int nbr)
{
    printf("%d\n", nbr);
}

void myFunction(void (*f)(*int)) //pseudocode
{
    for(int i = 0; i < 5; i++)
    {
        (*f)(*int); //pseudocode
    }
}

int main(void)
{
    myFunction(printNumber(5)); //pseudocode
    return (0);
}
c
5
Sigrid 23 dic. 2019 a las 00:21

2 respuestas

La mejor respuesta

printnumber(5) significa llamar a printnumber inmediatamente y pasarlo 5. Desea pasar printnumber y 5 por separado como dos argumentos

void printNumber(int nbr)
{
    printf("%d\n", nbr);
}

// void (*f)(int) is a pointer to a function that takes an int
// arg is the int to pass in
void myFunction(void (*f)(int), int arg)
{
    for(int i = 0; i < 5; i++)
    {
        // call f and pass in arg
        (*f)(arg);
    }
}

int main(void)
{
    // pass the function and the arg to use
    myFunction(printNumber, 5);
    return (0);
}
7
Lou Franco 22 dic. 2019 a las 21:30

Necesitas otro argumento.

void printNumber(int nbr)
{
    printf("%d\n", nbr);
}

void myFunction(void (*f)(int), int Arg)
{
    for(int i = 0; i < 5; i++)
    {
        (*f)(Arg);
    }
}

int main(void)
{
    myFunction(printNumber, 42);
    return (0);
}

La declaración de parámetro void (*f)(int) solo dice que la función apuntada por f espera un int. No significa que un int también esté empaquetado en el puntero de la función de alguna manera.

3
PSkocik 22 dic. 2019 a las 21:26