Tengo un PIC18F46K22 y lo programo con el compilador XC8. Al final, tendré un sistema como una PC con stdin
y stdout
. Entonces, en el bucle principal, habrá una función que verificará si hay una nueva entrada. Si hay entrada, se llamará a una función en consecuencia. Así, por ejemplo cuando una A en la entrada stdin
, el PIC se ejecutará una función como function_A
lugar de function_B
lo que se llama cuando una entrada de B.
Cuando el PIC termina 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 cada entrada se enviará 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, desde ese momento ya no está editando texto, sino mirando a través de 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 sobre 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
main
función llama a una función comofunction_A
function_A
cambia una variable globalfunction_addr
al puntero de dirección de la funciónin_function_A
- A partir de ese momento,
main
llama a la funciónfunction_addr
cuando hay una nueva entrada.
Entonces, lo que necesitaría es una main
función 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í, se function_addr
debe llamar a la función at . También necesito un function_A
que cambie el function_addr
puntero a in_function_A
.
Nota: cuando la función del sistema de archivos debe cerrarse, is_function_A
solo debe cambiar function_addr
a 0.
Básicamente, mi pregunta es cómo puedo
- Obtener la dirección de una función (y almacenarla en una variable)
- Llamar a una función a una dirección especificada
Respuestas:
Una función
Obtener la dirección de una función (y almacenarla en una variable)
Llamar a una función a una dirección especificada
fuente
fp(12)
no aumenta la legibilidad por encima(*fp)(12)
. Tienen diferente legibilidad.(*fp)(12)
recuerda al lector quefp
es un puntero, y también se asemeja a la declaración defp
. En mi opinión, este estilo está asociado con fuentes antiguas, como elementos internos X11 y K&R C. Una posible razón por la que podría estar asociado con K&R C es porque en ANSI C, es posible declararfp
usando la sintaxis de la función, sifp
es un parámetro:int func(int fp(double)) {}
. En K&R C eso hubiera sidoint func(fp) int (*fp)(double); { ... }
.Si bien la respuesta de Wouters es absolutamente correcta, esto puede ser más amigable para los principiantes y un mejor ejemplo con respecto a su pregunta.
Si no es obvio que el puntero de función realmente tiene asignada una dirección de función de destino, es aconsejable realizar una comprobación NULL.
fuente
fp
ocupa es en realidad inicialmente NULL. Lo haríaint (*fp)(int) = NULL;
como una declaración e inicialización combinadas para estar seguro: no desea saltar a una ubicación de memoria aleatoria debido a un valor tonto que acaba de estar allí. Luego solo asignafp
como en tuExample()
función.fp
es una "variable global" (como en el código anterior), entonces se garantiza que se inicializaráNULL
(sin tener que hacerlo explícitamente).