elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Lista dinámica de funciones en C (emulando los delegados de .NET)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Lista dinámica de funciones en C (emulando los delegados de .NET)  (Leído 1,765 veces)
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
[C] Lista dinámica de funciones en C (emulando los delegados de .NET)
« en: 20 Diciembre 2015, 01:38 am »

Muy buenas.

Pues la idea es hacer algo parecido a los delegados de C# pero con el C de toda la vida.
Sobre una lista dinámica de diferentes funciones con la misma firma se puede hacer las siguientes operaciones:
· Añadir funciones al final de la lista
· Quitar la primera aparición de una función dada
· Vaciar la lista de una tacada
· Ejecutar todas las funciones de la lista de forma secuencial y con unos parámetros comunes dados en la llamada a la ejecución.

En este programa se trabaja sobre una función que acepta un char* y no devuelve nada, pero se puede modificar fácilmente para trabajar con otras funciones.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct tdelegate {
  5. void (*func)(char*);
  6. struct tdelegate *next;
  7. } DELEGATE;
  8.  
  9. int delegate_add(DELEGATE **pdelegate, void (*funcpointer)(char*)) {
  10. DELEGATE *newdelegate = malloc(sizeof(DELEGATE));
  11. DELEGATE *aux = NULL;
  12.  
  13. if(newdelegate == NULL)
  14. return 0;
  15.  
  16. newdelegate->func = funcpointer;
  17. newdelegate->next = NULL;
  18.  
  19. if(*pdelegate == NULL)
  20. *pdelegate = newdelegate;
  21. else {
  22. aux = *pdelegate;
  23. while(aux->next != NULL)
  24. aux = aux->next;
  25. aux->next = newdelegate;
  26. }
  27. return 1;
  28. }
  29.  
  30. void delegate_exec(DELEGATE **pdelegate, char *str) {
  31. DELEGATE *actualdelegate = *pdelegate;
  32.  
  33. while(actualdelegate != NULL) {
  34. actualdelegate->func(str);
  35. actualdelegate = actualdelegate->next;
  36. }
  37. }
  38.  
  39. void delegate_del(DELEGATE **pdelegate, void (*funcpointer)(char*)) {
  40. DELEGATE *actualdelegate = *pdelegate;
  41. DELEGATE *aux = NULL;
  42. int found = 0;
  43.  
  44. if(funcpointer == NULL || actualdelegate == NULL)
  45. return;
  46.  
  47. if(actualdelegate->func == funcpointer)
  48. {
  49. aux = actualdelegate->next;
  50. free(actualdelegate);
  51. actualdelegate = aux;
  52. }
  53. else {
  54. while(actualdelegate->next != NULL && !found) {
  55. if(actualdelegate->next->func == funcpointer) {
  56. found = 1;
  57. aux = actualdelegate->next->next;
  58. free(actualdelegate->next);
  59. actualdelegate->next = aux;
  60. }
  61. else actualdelegate = actualdelegate->next;
  62. }
  63. }
  64. }
  65.  
  66. void delegate_free(DELEGATE **pdelegate) {
  67. DELEGATE *aux = NULL;
  68.  
  69. if(*pdelegate == NULL) return;
  70. while(*pdelegate != NULL) {
  71. aux = (*pdelegate)->next;
  72. free(*pdelegate);
  73. *pdelegate = aux;
  74. }
  75. }
  76.  
  77. /* FUNCIONES DE PRUEBA */
  78. void a(char *str) {
  79. printf("%p: %s\n", &a, str);
  80. }
  81.  
  82. void b(char *str) {
  83. printf("%p: %s\n", &b, str);
  84. }
  85.  
  86. void c(char *str) {
  87. printf("%p: %s\n", &c, str);
  88. }
  89.  
  90. /* PROGRAMA DE PRUEBA */
  91. int main() {
  92.  
  93. DELEGATE *midelegado = NULL;
  94.  
  95. delegate_add(&midelegado, &a);
  96. delegate_add(&midelegado, &b);
  97. delegate_add(&midelegado, &c);
  98.  
  99. delegate_exec(&midelegado, "hola");
  100.  
  101. delegate_del(&midelegado, &b);
  102. delegate_exec(&midelegado, "adios");
  103.  
  104. delegate_free(&midelegado);
  105. midelegado = NULL;
  106.  
  107. return 0;
  108. }
  109.  
  110.  


En línea

kondrag_X1

Desconectado Desconectado

Mensajes: 157


Ver Perfil
Re: [C] Lista dinámica de funciones en C (emulando los delegados de .NET)
« Respuesta #1 en: 21 Diciembre 2015, 00:02 am »

muy bueno tenia en mente hacer algo parecido. Le echaré un ojo.  ;-)


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: [C] Lista dinámica de funciones en C (emulando los delegados de .NET)
« Respuesta #2 en: 21 Diciembre 2015, 02:08 am »

Muy buenas!

Espero que te sirva  :D

Si desarrollas tu idea postea, tengo ganas de verla  :rolleyes:
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Lista Dinamica en Java
Java
ALEJO007 1 2,595 Último mensaje 14 Enero 2005, 04:41 am
por Ragnarok
lista dinamica
Java
brian_e 8 13,442 Último mensaje 6 Mayo 2009, 02:15 am
por thurgrim
lista con matriz dinamica
Programación C/C++
L·Storm! 2 4,063 Último mensaje 3 Agosto 2011, 03:03 am
por L·Storm!
memoria dinamica y funciones
Programación C/C++
m@o_614 1 1,282 Último mensaje 25 Noviembre 2013, 16:45 pm
por rir3760
error en mi programa con lista dinamica
Programación C/C++
:Luigi 1 1,559 Último mensaje 2 Enero 2015, 20:58 pm
por :Luigi
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines