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


 


Tema destacado:


  Mostrar Mensajes
Páginas: 1 ... 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 [111] 112
1101  Programación / Programación C/C++ / Re: [C] Lista dinámica de funciones en C (emulando los delegados de .NET) en: 21 Diciembre 2015, 02:08
Muy buenas!

Espero que te sirva  :D

Si desarrollas tu idea postea, tengo ganas de verla  :rolleyes:
1102  Programación / Programación C/C++ / [C] Lista dinámica de funciones en C (emulando los delegados de .NET) en: 20 Diciembre 2015, 01:38
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.  
1103  Programación / Programación C/C++ / Re: Interpretar o compilar desde txt en: 18 Diciembre 2015, 20:48
Muy buenas.

Supongo a que te refieres a que buscas algo como un intérprete de C++. Buscando un poco por internet he encontrado lo siguiente CLIN que es un intérprete de c++, en el sabor de CLAN.
Si quieres algo más tradicional te puedes decantar por make, CMake, o algún IDE que usa esta tecnología. Tal vez te guste QT creator.
1104  Programación / Programación C/C++ / Re: videoclub en: 16 Diciembre 2015, 18:43
Muy buenas.

¿Has realizado algo, como los menus, la estructura de datos, la estructura basica del programa?
1105  Programación / Programación C/C++ / Re: Ayuda con una ordenacion de un array please? :P en: 13 Diciembre 2015, 02:37
Muy buenas.

Si a lo que te refieres a no cambiar el archivo, pues sin guardarlo en dicho archivo seguirá desordenado.
Si te refieres a seguir teniendo el array original desordenado puedes hacerle una copia y trabajar sobre la copia.
1106  Programación / Programación C/C++ / Re: Ayuda con una ordenacion de un array please? :P en: 13 Diciembre 2015, 02:17
Muy buenas.

Ahora que lo he visto, fallo mio.  :-(

Siendo productoArray tu array de productos declarado como

Código
  1. producto productoArray[pLength];

siendo pLength una constante numérica que marca el tamaño de tu array, la llamada a qsort debe ser así:

Código
  1. qsort(productoArray, pLength, sizeof(producto), comparar_producto);

No se si la funcion ordenarProducto debes incluirla obligatoriamente pero no te haría falta porque qsort hace todo el trabajo. Allí donde tengas ordenarProducto pones directamente qsort y tu array se debe ordenar directamente.
1107  Programación / Programación C/C++ / Re: tengo un problema conestructuras con arreglos !!!! en: 12 Diciembre 2015, 22:25
Muy buenas.

Código
  1. #include<conio.h>
  2. // conio.h no es una libreria estandar y no funcionara en todos los compiladores.
  3. // ademas no usas ninguna de sus funciones.
  4. #include<stdio.h>
  5. #include <stdlib.h>
  6.  
  7. struct matrix_x {  
  8. int kick;
  9. int kick2;
  10. char nombre[10];
  11. struct  matrix_x *psiguiente;
  12. };
  13.  
  14. struct matrix_x *pprimero;
  15. struct matrix_x *pultimo;
  16. int i = 0; // Una variable global que no usas
  17.  
  18. void insertar (int dato, char nombre[], int codigo) {
  19.  
  20. struct  matrix_x * paux;
  21.  
  22. paux = (struct matrix_x*)malloc(sizeof(struct  matrix_x));  
  23.  
  24. if(paux == NULL)
  25. {        
  26. printf("error en la memoria ");
  27. }
  28. else
  29. {
  30. paux->kick = dato;
  31. paux->kick2 = codigo;
  32. paux->nombre = nombre; // Debes los datos, no la direccion de los datos -> strncpy(paux->nombre, nombre, 10);
  33. paux->psiguiente = NULL;
  34.  
  35. if (pprimero == NULL)
  36. {
  37. pprimero = paux;
  38. pultimo = paux;  
  39. }
  40. else
  41. {
  42. pultimo->psiguiente = paux;
  43. pultimo = paux;
  44. }
  45. }
  46. i++;
  47. }
  48.  
  49. void mostrar () {
  50. struct matrix_x *aux;
  51. aux = (struct matrix_x*)malloc(sizeof (struct  matrix_x)); // Esta linea no la necesitas
  52. aux = pprimero; // pues aqui haces que aux apunte a pprimero abandonado la memoria apuntada anteriormente. Malo porque hay memoria asignada que no podras recuperar.
  53. int i = 0; // ocultas la variable i global
  54. while (aux != NULL){
  55. printf ("\n dato___%d       codigo___%d  ",aux->kick,aux->kick2);
  56. fflush(stdin); // fflush espera un flujo de salida. Esto no funcionara en todos los compiladores o SS.OO.
  57. printf ("\n  nombre %s",aux->nombre);
  58. fflush(stdin); // otra vez el mal uso de fflush
  59. aux = aux->psiguiente;
  60. i++; // incrementas i local, pero no la usas
  61. }
  62. }
  63.  
  64. int main() {
  65. int cx = 0;
  66. int dato, codigo;
  67. char  nombre[10];
  68. printf("Introduzca cero para continuar\n"); //
  69. while(dato != 0 && codigo != 0 && nombre != 0) {
  70. fflush(stdin); // otra vez el mal uso de fflush
  71. printf ("dame dato_%d____",cx);
  72. scanf ("%d",&dato);
  73. printf ("dame codigo_%d___",cx);
  74. scanf ("%d",&codigo );
  75. printf ("dame nombre _%d___",cx);
  76. fflush(stdin); // otra vez el mal uso de fflush
  77. scanf ("%s",&nombre[cx] ); // varios fallos aquí -> scanf("%s", nombre);
  78. insertar(dato,nombre,codigo);
  79. cx=cx+1; // mas correcto usar ++cx. Por otra parte enganas al usuario, pues aunque insertar falle
  80. // al adquirir memoria con malloc y no introduzca el dato, incrementas cx sin que el dato
  81. // anterior se haya introducido, falseando asi el numero de datos introducidos.
  82. }
  83. mostrar();
  84. printf ("has salido del programa");
  85. // deberias incluir una función para liberar la memoria
  86. // que has adquirido con cada uno de los malloc en insertar.
  87.  
  88. // main debe devolver un valor: el S.O. espera que devuelva 0 si el programa ha terminado con exito.
  89. }
1108  Programación / Programación C/C++ / Re: Ayuda con una ordenacion de un array please? :P en: 12 Diciembre 2015, 21:23
Muy buenas:

Por lo pronto se me ocurre lo siguiente:
Hacer una función que compare dos productos.

Código
  1. int comparar_producto(const void *p1, const void *p2) {
  2.    articulo *art1 = (articulo*) p1;
  3.    articulo *art2 = (articulo*) p2;
  4.    return strcmp(art1->nombre, art2->nombre);
  5. }

Y finalmente usas la función qsort, de stdlib, para que te ordene ella sola el array.

Código
  1. qsort(productoArray[], pLength, sizeof(producto), comparar_producto);
1109  Programación / Programación C/C++ / Re: ¿Como cambiar un puntero de caracteres desde otra función? en: 12 Diciembre 2015, 16:43
Muy buenas.

Las constantes de cadena se guardan en una posición de memoria que C dedica para las constantes. Cuando asignas así una cadena a un puntero no varías una posición de memoria sino que apuntas a una zona de memoria que no va a cambiar en todo el programa.

Tu función recoge un puntero y por tanto podrías modificar en dicha función a lo que hay en esa zona de memoria que apunta el puntero, pero el puntero en sí, al ser una copia, aunque lo cambies dentro de la función, en main seguirás teniendo el valor original. Si quieres cambiarlo de la forma que quieres hacerlo pásalo con un puntero a puntero, entonces podrás cambiar hacia a donde apunta.

Una cosa a tener en cuenta: si lo haces de esta forma la cadena que dejes huérfana será un lastre: su memoria estará ocupada y el programa no la va a poder reclamar para darle otro uso, pero no podrás acceder a ella más pues habrás perdido su dirección al dar otro valor al puntero.
1110  Programación / Programación C/C++ / Re: Una forma curiosa de dar un tamaño. en: 9 Diciembre 2015, 21:57
Sí, pero apuntaba a que no se ve, en C, ese tipo de construcción: int[5], por ejemplo, es mas tipo notación de C#, como en
Código
  1. int[] v = new int[5];
pero sin embargo es válida y muy parecida  :rolleyes:
Código
  1. int* p = malloc(sizeof(int[5]));
Páginas: 1 ... 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 [111] 112
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines