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

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


  Mostrar Temas
Páginas: 1 [2]
11  Foros Generales / Noticias / BASH Ubuntu sobre Windows 10... nativo en: 31 Marzo 2016, 09:44 am
What the?

Pues sí, los chicos de Canonical han portado BASH de su Linux a Windows 10 y éste ejecuta el entorno de forma nativa, como si fuera el propio Linux.
Este BASH viene con todo lo que se podría esperar de él: awk, sed, grep, vi, etc. y junto al gestor de paquetes apt así que se pueden descargar paquetes como emacs.

¿Qué os parece este acercamiento?

http://www.hanselman.com/blog/DevelopersCanRunBashShellAndUsermodeUbuntuLinuxBinariesOnWindows10.aspx
12  Foros Generales / Sugerencias y dudas sobre el Foro / [SOLUCIONADO] El antihack de la página es demasiado restrictivo en: 8 Marzo 2016, 09:32 am
Ya va dos veces que intento realizar una respuesta en el foro de C/C++ y el sistema de protección me bloquea. ¿Cuáles son las nuevas reglas que espera el foro?
13  Foros Generales / Sugerencias y dudas sobre el Foro / Cambiar texto GeSHi por algo más descriptivo en: 14 Febrero 2016, 22:01 pm
Es cierto que GeSHi es poco descriptivo y, sobre todo para la gente nueva que entra, no se pondrá a jugar con cada una de las opciones de formato antes de postear su duda así que van a dejar el código en texto llano. Yo también lo he hecho.

Por eso en vez de tener el título GeSHi, la lista desplegable debería titularse 'elige tu lenguaje...' o 'Código en lenguaje...'; o algo que a primera vista ya diera a entender que eso sirve para que el código que va dentro se va a formatear en el lenguaje que se elija.
14  Foros Generales / Sugerencias y dudas sobre el Foro / Sobre caracteres no ingleses entre las etiquetas GeSHi en los foros en: 4 Enero 2016, 18:14 pm
Ya me había acostumbrado a que la ñ y las letras con tilde en los foros aparecen mal escritas cuándo se muestra código, pero mi sorpresa fue cuándo vi que en los mensajes privados sí se ven bien.
Por tanto esto es una sugerencia.
Por lo visto los mensajes privados y los foros están en codificaciones diferentes. Se podrían arreglar los foros para permitir tildes y la ñ.

Sí, pongo tildes en los comentarios  :rolleyes:
15  Programación / Programación C/C++ / [C] Argumentos anónimos en llamadas a funciones en: 22 Diciembre 2015, 21:48 pm
Muy buenas.

Pues sigo con mi cruzada de autodescubrimiento de gramáticas extrañas que C acepta.

Supongamos la siguiente función que acepta un array de cadenas y las va imprimiendo hasta encontrar una cadena vacía:

Código
  1. void func(char* str[]) {
  2.    int i = 0;
  3.    while(str[i][0] != '\0')
  4.        printf("%s\n", str[i++]);
  5. }

Ante esto uno piensa que para llamar a dicha función debe crear una variable de esta forma
Código
  1. char *lista[] = {"uno", "dos", "tres", "cuatro", "");
y después llamar a la función
Código
  1. func(lista);

Pues se puede llamar a la función pasando un argumento anónimo, la lista entera directamente, de esta forma
Código
  1. func((char*[]){"uno", "dos", "tres", "cuatro", ""});

Obviamente, como siempre, esto se puede modificar al gusto y necesidades de cada uno.

Un programa de prueba completo es este:
Código
  1. #include <stdio.h>
  2.  
  3. void func(char* str[]) {
  4.    int i = 0;
  5.    while(str[i][0] != '\0')
  6.    printf("%s\n", a[i++]);
  7. }
  8.  
  9. int main()
  10. {
  11.    func((char*[]){"uno", "dos", "tres", "cuatro", ""});
  12.    return 0;
  13. }

Ya me diréis que os parece  ;)
16  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 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.  
17  Programación / Programación C/C++ / Un programa que muestra donde el S.O. pone cada cosa. en: 3 Diciembre 2015, 21:44 pm
No es mucha cosa, solo un divertimento; pero sirve para ver en qué parte de la memoria pone el S.O. las funciones, las variables locales, las globales y las dinámicas.
Así se puede ver como el sistema separa la memoria de código, la memoria de pila (stack) y la memoria del montón (heap).

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. char gc;
  5. int gi;
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9. char c;
  10. int i;
  11. int *p = malloc(sizeof(int));
  12. printf("printf\t= %p\n", &printf);
  13. printf("malloc\t= %p\n", &malloc);
  14. printf("main\t= %p\n", &main);
  15. printf("\n");
  16. printf("gi\t= %p\n", &gi);
  17. printf("gc\t= %p\n", &gc);
  18. printf("\n");
  19. printf("argv\t= %p\n", &argv);
  20. printf("argc\t= %p\n", &argc);
  21. printf("\n");
  22. printf("c\t= %p\n", &c);
  23. printf("i\t= %p\n", &i);
  24. printf("p\t= %p\n", &p);
  25. printf("\n");
  26. for(i = 0; i < argc; ++i)
  27. printf("argv[%i]\t= %p -- %s$\n", i, argv[i], argv[i]);
  28. printf("\n");
  29. printf("p (->)\t= %p\n", p);
  30. free(p);
  31. return 0;
  32. }

P. ej.:

$ ./c 1 12 123 1234 12345
printf   = 0x4004f0
malloc   = 0x400520
main   = 0x40061d

gi   = 0x60105c
gc   = 0x601060

argv   = 0x7ffd71212400
argc   = 0x7ffd7121240c

c   = 0x7ffd71212413
i   = 0x7ffd71212414
p   = 0x7ffd71212418

argv[0]   = 0x7ffd71214551 -- ./c$
argv[1]   = 0x7ffd71214555 -- 1$
argv[2]   = 0x7ffd71214557 -- 12$
argv[3]   = 0x7ffd7121455a -- 123$
argv[4]   = 0x7ffd7121455e -- 1234$
argv[5]   = 0x7ffd71214563 -- 12345$

p (->)   = 0x1e36010
18  Programación / Programación C/C++ / Una forma curiosa de dar un tamaño. en: 2 Diciembre 2015, 22:16 pm
Cuándo se usa la función malloc, por ejemplo, y una llamada básica podría ser algo así:

int *p = malloc(sizeof(int) * 5);

Y ahora viene la parte curiosa y mi planteamiento:

int arr[5] es un array de enteros.
int (*p)[5] es un puntero a un array de 5 enteros.
Lo único que tienen en común los dos son el tipo de dato, int, y el tamaño del array, 5. El nombre que le demos no tiene imporancia. Si se obvia dicho nombre nos debería dar un tamaño pero sin declarar nada.

Por tanto el código antes escrito podría codificarse de una forma un poco más intuitiva:

int *p = malloc( sizeof(int[5]) );

Y funciona, al menos con GCC.

>>> Editado porqué estas líneas no tienen un sentido práctico <<<

También funciona:

int *p = malloc( sizeof(int[5][5]) );

y

int **p = malloc( sizeof(int[5][5]) );


>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<

¿Qué os parece?
Páginas: 1 [2]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines