24 votos

¿C codificación diseño - punteros a función?

Tengo un PIC18F46K22 y el programa con el compilador XC8. En el final, voy a tener un sistema como el de un pc con stdin y stdout. Así, en el bucle principal habrá una función que es la comprobación de si hay nueva entrada. Si no hay entrada, una función que será llamada en consecuencia. Así, por ejemplo, cuando la entrada de Una a en stdin, el PIC ejecuta una función como function_A en lugar de function_B que se llama cuando la entrada de una B.

Cuando el PIC se realiza con la función, quiero que la nueva entrada se envía a la función. Así que cuando se pulsa Una abre el RS232 transmisor, a partir de ese momento cada entrada se envían a través de RS232. En el fin del proyecto es de por sí un editor de texto. Así que cuando se pulsa Una se abre el sistema de archivos, a partir de ese momento usted no está de edición de texto más, pero mirando a través de una lista de archivos. Eso significa que pulsando Arriba y Abajo significa algo diferente que en el texto de la edición de medio ambiente.

He hecho un montón de pensamiento sobre cómo este programa en C. yo pensaba que esto de la noche anterior y me gustaría saber si es posible y si es así, cómo. Lo que quiero hacer es:

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

Así que lo que necesita es un main función que comprueba si function_addr es cero. Si es así, un 'normal' de la función debe ser llamada, como function_A. Si no lo es, la función en function_addr debe ser llamado. También necesito un function_A que cambios en la function_addr a un puntero a in_function_A.

Nota: cuando el sistema de ficheros de la función debe ser cerrado, is_function_A sólo debe cambiar function_addr a 0.

Así que básicamente mi pregunta es ¿cómo puedo

  • Obtener la dirección de una función (y la almacenamos en una variable)
  • Llamar a una función en una dirección especificada

21voto

GetFree Puntos 495

Una función de

int f(int x){ .. }

Obtener la dirección de una función (y almacenarlo en una variable)

int (*fp)(int) = f;

Llamar a una función en una dirección especificada

int x = (*fp)( 12 );

17voto

Bash Puntos 1680

Mientras que Wouters respuesta es absolutamente correcta este tal vez principiante más amigable y un ejemplo mejor respecto a tu 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 realmente tiene una dirección de función objetivo asignada, revise su sabio para llevar a cabo un valor NULL.

if (fp != NULL)
    fp(); /* with parameters, if applicable */

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X