Implementación Práctica
Patrones de Punteros a Funciones en el Mundo Real
Los punteros a funciones son herramientas versátiles con numerosas aplicaciones prácticas en la programación de sistemas, el manejo de eventos y el diseño modular.
Patrones de Diseño
1. Implementación del Patrón de Comando
typedef struct {
void (*execute)(void* data);
void* context;
} Command;
void execute_command(Command* cmd) {
if (cmd && cmd->execute) {
cmd->execute(cmd->context);
}
}
Mecanismo de Manejo de Eventos
#define MAX_HANDLERS 10
typedef void (*EventHandler)(void* data);
typedef struct {
EventHandler handlers[MAX_HANDLERS];
int handler_count;
} EventDispatcher;
void register_event_handler(EventDispatcher* dispatcher, EventHandler handler) {
if (dispatcher->handler_count < MAX_HANDLERS) {
dispatcher->handlers[dispatcher->handler_count++] = handler;
}
}
void dispatch_event(EventDispatcher* dispatcher, void* event_data) {
for (int i = 0; i < dispatcher->handler_count; i++) {
dispatcher->handlers[i](event_data);
}
}
Patrones de Estrategia de Devoluciones de Llamada
| Patrón |
Descripción |
Caso de Uso |
| Patrón Estrategia |
Selección dinámica de algoritmos |
Modificación del comportamiento en tiempo de ejecución |
| Patrón Observador |
Notificación de eventos |
Acoplamiento laxo entre componentes |
| Arquitectura de Plugins |
Carga dinámica de módulos |
Sistemas extensibles |
Técnicas Avanzadas de Punteros a Funciones
Arrays de Punteros a Funciones
typedef int (*OperacionMatematica)(int, int);
int sumar(int a, int b) { return a + b; }
int restar(int a, int b) { return a - b; }
int multiplicar(int a, int b) { return a * b; }
OperacionMatematica operaciones_matematicas[] = {sumar, restar, multiplicar};
int aplicar_operacion(int x, int y, int indice_operacion) {
if (indice_operacion >= 0 && indice_operacion < sizeof(operaciones_matematicas) / sizeof(operaciones_matematicas[0])) {
return operaciones_matematicas[indice_operacion](x, y);
}
return 0;
}
Implementación de Máquina de Estados
stateDiagram-v2
[*] --> Inactivo
Inactivo --> Procesando: Evento de Inicio
Procesando --> Completado: Éxito
Procesando --> Error: Fallo
Completado --> [*]
Error --> [*]
Procesamiento Asíncrono Basado en Devoluciones de Llamada
typedef void (*CallbackCompletado)(int resultado, void* contexto);
typedef struct {
void* datos;
CallbackCompletado al_completar;
void* contexto;
} AsyncTask;
void procesar_tarea_asincrona(AsyncTask* tarea) {
// Simular procesamiento asíncrono
int resultado = /* lógica de procesamiento */;
if (tarea->al_completar) {
tarea->al_completar(resultado, tarea->contexto);
}
}
Mecanismo de Manejo de Errores y Registros
typedef enum {
LOG_INFO,
LOG_ADVERTENCIA,
LOG_ERROR
} NivelLog;
typedef void (*ManejoLog)(NivelLog nivel, const char* mensaje);
void registrar_mensaje(ManejoLog manejador, NivelLog nivel, const char* mensaje) {
if (manejador) {
manejador(nivel, mensaje);
}
}
Consideraciones de Rendimiento
- Minimizar la sobrecarga de indirección.
- Usar funciones en línea cuando sea posible.
- Preferir punteros a funciones estáticas.
- Evitar aritmética compleja de punteros.
Compilación y Optimización
## Compilar con advertencias adicionales
gcc -Wall -Wextra -O2 ejemplo_puntero_funcion.c -o ejemplo
## Habilitar comprobaciones de seguridad de punteros a funciones
gcc -fsanitize=address ejemplo_puntero_funcion.c -o ejemplo
En LabEx, recomendamos practicar estos patrones para desarrollar aplicaciones C robustas y flexibles que utilicen punteros a funciones.