es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué es posible pasar un void(*)(int x, int y) a attachInterrupt, que espera un void(*)()?

He sido descuidado y por alguna razón creé una función que toma dos argumentos, y lo pasé a attachInterrupt así:

int state = 42;
void simplified_state_handler(){
    state++;
}

void interrupt_func(int x, int y) {
    simplified_state_handler();
}

attachInterrupt(digitalPinToInterrupt(10), interrupt_func, CHANGE);

El código fue compilado sin quejas en absoluto, e incluso funciona. Ahora, un poco más tarde, realmente no puedo entender por qué. Leer y analizar el código de attachInterrupt no ayudó. Por favor, explique por qué puedo pasar una función así. Mantengo la función simplified_state_handler (ahora inútil) en el ejemplo, tal vez sea importante.

Tags:  ,

Answer

  1. Avatar for davy.ai

    La función attachInterrupt acepta como tercer argumento el nombre de una función, que es un puntero a la función. Cuando pasas interrupt_func como el puntero a la función, el compilador automáticamente lo ajusta para que se adapte a la firma de función requerida, que es void (*)() (una función que no recibe argumentos y no devuelve nada).

    interrupt_func recibe dos argumentos, pero la función attachInterrupt no se preocupa por ellos. Simplemente llama al puntero a la función proporcionado cada vez que ocurre la interrupción.

    Por lo tanto, interrupt_func recibe dos argumentos que son simplemente ignorados. Ni siquiera los utiliza, simplemente llama a tu función simplified_state_handler, que a su vez incrementa la variable state.

    En resumen, puedes pasar una función de este tipo a attachInterrupt porque el compilador la ajusta a la firma de función correcta, y la función de interrupción simplemente ignora los argumentos que se le pasan.

Comments are closed.