Diseño de codificación en C: ¿punteros a funciones?

23

Tengo un PIC18F46K22 y lo programo con el compilador XC8. Al final, tendré un sistema como una PC con stdin y stdout . Así que en el bucle principal habrá una función que verifica si hay una nueva entrada. Si hay entrada, una función se llamará en consecuencia. Así, por ejemplo, cuando ingreso una A en stdin , el PIC ejecutará una función como function_A en lugar de function_B , que se llama cuando ingrese una B.

Cuando el PIC haya terminado con la función, quiero que la nueva entrada se envíe a la función. Entonces, al presionar A se abre el transmisor RS232, desde ese momento todas las entradas se enviarán a través de RS232. Al final, el proyecto es un editor de texto independiente. Entonces, al presionar A se abre el sistema de archivos, a partir de ese momento ya no se edita el texto, sino que se busca en una lista de archivos. Eso significa que presionar Arriba y Abajo significa algo diferente que en el entorno de edición de texto.

He pensado mucho en cómo programar esto en C. Lo pensé anoche y me gustaría saber si es posible y, de ser así, cómo. Lo que quiero hacer es:

  • La función main llama a una función como function_A
  • function_A cambia una variable global function_addr al puntero de dirección de la función in_function_A
  • A partir de ese momento, main llama a la función en function_addr cuando hay una nueva entrada.

Entonces, lo que necesitaría es una función main que verifique si function_addr es cero. Si es así, se debe llamar a una función 'normal', como function_A . Si no es así, la función en function_addr debería ser llamada. También necesito un function_A que cambia el function_addr a un puntero a in_function_A .

Nota: cuando se debe cerrar la función del sistema de archivos, is_function_A solo debe cambiar function_addr a 0.

Básicamente mi pregunta es cómo puedo

  • Obtenga la dirección de una función (y almacénela en una variable)
  • llamar a una función en una dirección especificada
pregunta Keelan

2 respuestas

21

Una función

int f(int x){ .. }

Obtenga la dirección de una función (y almacénela en una variable)

int (*fp)(int) = f;

Llamar a una función a una dirección específica

int x = (*fp)( 12 );
    
respondido por el Wouter van Ooijen
17

Si bien la respuesta de Wouters es absolutamente correcta, tal vez sea más amigable para los principiantes y un mejor ejemplo con respecto a su pregunta.

int (*fp)(int) = NULL;

int FunctionA(int x){ 
    return x + x;
}

int FunctionB(int x){ 
    return x * x;
}

void Example(void) {
    int x = 0;

    fp = FunctionA;
    x = fp(3);  /* after this, x == 6 */

    fp = FunctionB;
    x = fp(3);  /* after this, x == 9 */
}

Si no es obvio que el puntero de función tenga asignada una dirección de función de destino, es aconsejable realizar una comprobación NULA.

if (fp != NULL)
    fp(); /* with parameters, if applicable */
    
respondido por el Rev1.0

Lea otras preguntas en las etiquetas