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


 


Tema destacado: Únete al Grupo Steam elhacker.NET


  Mostrar Temas
Páginas: [1] 2
1  Programación / Programación C/C++ / Divertimento: Hello world! en: 27 Agosto 2019, 19:04
Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.    int w,t,f;
  5.    w = 3;
  6.    f = 1214606441+w;
  7.    there:
  8.    t=32;
  9.    here:
  10.    putchar(f>>(t-=8)&0377);
  11.    if(t) goto here;
  12.    f += w==3? 649792259 : 55307442;
  13.    if(--w) goto there;
  14. }
2  Programación / Programación C/C++ / Creando nuevas keywords para C en: 30 Julio 2019, 17:51
El otro día, mientras aprendía Python, me fijé en foreach y range. Me pregunté si en C se podía tener una expresión parecida.

Y llegué a este ejemplo básico.

Código
  1. #include <stdio.h>
  2.  
  3. // Desde 1 hasta top. Haz lo que quiereas con el valor en medio ------------------------------
  4. #define foreach(var, top) for(int foreach_var = (top); var = f(foreach_var); foreach_var = 0)
  5.  
  6. int f(unsigned number) {
  7.    static unsigned top;
  8.    static unsigned actual;
  9.  
  10.    if(number != 0) {
  11.        top = number;
  12.        actual = 0;
  13.    }
  14.  
  15.    if(actual == top)
  16.        return 0;
  17.  
  18.    return ++actual;
  19. }
  20. // -------------------------------------------------------------------------------------------
  21.  
  22. int main(){
  23.    int x;
  24.  
  25.    /* Nueva funcionalidad */
  26.    foreach(x, 5) {
  27.        printf("%d\n", x);
  28.    }
  29. }

Lo dicho, es básico, pero se podría ir mejorando o hacer otras cosas, por supuesto.
3  Programación / Programación C/C++ / Y después de tanto tiempo C sigue sorprendiéndome en: 25 Mayo 2018, 23:43
Hace unos días me encontré que existía la siguiente notación para definir un array:
Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.    char c[] = {[0 ... 26]'='};
  5.    int d[] = {[0 ... 4]1, [8 ... 12]2};
  6.  
  7.    printf("\n%s\n", c);
  8.    for(int i=0; i<sizeof(d)/sizeof(d[0]); ++i)
  9.        printf(" %d", d[i]);
  10.    printf("\n%s\n", c);
  11. }
4  Programación / Programación C/C++ / setjmp y longjmp ¿Cuándo usarlas? en: 26 Abril 2018, 11:41
Posiblemente las dos funciones más extrañas de C y con menor uso, según he visto. Por eso: a parte de simular excepciones ¿Qué uso se les podría dar a ese par de funciones? Por mi parte todavía no se me ha ocurrido ni presentado la ocasión de usarlas.
5  Programación / Programación C/C++ / [APORTE] conio.h mínimo para Llinux en: 29 Mayo 2017, 11:06
Es frecuente en este foro encontrarse con gente que sigue trabajando con TurboC de Borland con la líbrería conio.h y normalmente la usan para dos o tres funciones: gotoxy, getch y getche. Para los que trabajamos con Linux nos da un poco de pereza ir editando todas esas líneas para hacer el código ejecutable. Pues bien, a raíz de eso he decidido hacerme una pequeña conio para quitarme de encima susodicho trabajo y ahora quiero compartirla con vosotros.

conio.h
Código
  1. #ifndef CONIO_PARA_LINUX
  2. #define CONIO_PARA_LINUX
  3.  
  4. #include <stdio.h>
  5. #include <termios.h>
  6.  
  7. void gotoxy(int x, int y) {
  8.    printf("\33[%d;%df", y, x);
  9. }
  10.  
  11. static char getch_interno(int eco) {
  12.    char c;
  13.    struct termios old, new;
  14.  
  15.    tcgetattr(0, &old);
  16.    new = old;
  17.    new.c_lflag &= ~ICANON;
  18.    new.c_lflag &= eco ? ECHO : ~ECHO;
  19.    tcsetattr(0, TCSANOW, &new);
  20.    c = getchar();
  21.    tcsetattr(0, TCSANOW, &old);
  22.  
  23.    return c;
  24. }
  25.  
  26. char getch() {
  27.    return getch_interno(0);
  28. }
  29.  
  30. char getche() {
  31.    return getch_interno(1);
  32. }
  33.  
  34. #endif
6  Programación / Programación C/C++ / TIP: para limpiar el buffer de entrada en: 29 Abril 2016, 13:19
Intentando responder a un post y, como siempre pruebo el código de mi respuesta antes, necesitaba de una forma genérica una instrucción para limpiar el buffer de entrada stdin después de adquirir una cadena de entrada mediante fgets.

fgets, según el largo de la cadena introduce saca de stdin el carácter '\n' o no y si se usa while (getchar() != '\n'); sin que haya un carácter de nueva línea en el buffer el programa se detiene y espera a que el usuario introduzca algo. Y eso no queda bien.. Por otra parte controlar a mano si hay o no un carácter de nueva línea es engorroso y ensucia el código.

Llegué a la siguiente solución. Necesita de la librería string.h.

Código
  1. #include <string.h>
  2.  
  3. #define clrfstr(X) { \
  4.     if(!strchr((X), '\n')) \
  5.         while(getchar() != '\n'); \
  6. }

Esto vacía, o no, stdin dependiendo de si ha la cadena ingresada contiene, o no, el carácter de nueva línea.

El código se debe incluir justo después de fgets o de la función que se haya usado para adquirir la cadena. X es el argumento que representa a la variable cadena adquirida.
7  Programación / Programación C/C++ / [C] Estructuras con miembros privados. en: 21 Abril 2016, 23:45
Como digo esto se trata de C y no de C++.

Es posible emular, en C, el comportamiento de miembros privados de datos definidos por el programador, al estilo de la POO, para que los usuarios de esa estructura no puedan acceder directamente a los datos que hay dentro de ella.

Las ventajas que tiene esta técnica:
1. El usuario no puede modificar los datos directamente y deben pasar por los filtros que imponga el programador.
2. El programador puede cambiar los datos internos que tiene la estructura y su interfaz (funciones getters y setters) sin que el usuario tenga que recompilar todo su código para hacer uso de estas modificaciones.

Los inconvenientes:
1. Sólo se puede situar la estructura en memoria del montón con lo que aparece el problema de la fragmentación de la memoria
2. La memoria se debe liberar ya sea mediante free o una función que proporcione el programador a modo de destructor.

Aquí va el código:


dato.h
Código
  1. #ifndef __DATO_H__
  2. #define __DATO_H__
  3.  
  4. typedef struct __dato__ DATO;
  5.  
  6. DATO* new_dato();
  7. void delete_dato(DATO* objeto);
  8. int get_dato(DATO* objeto);
  9. void set_dato(DATO* objeto, int valor);
  10.  
  11. #endif


dato.c
Código
  1. #include <stdlib.h>
  2. #include "dato.h"
  3.  
  4. struct __dato__ {
  5.    int miembro_privado;
  6. };
  7.  
  8. DATO* new_dato() {
  9.    DATO* d = malloc(sizeof(DATO));
  10.    d->miembro_privado = 0;
  11.    return d;
  12. }
  13.  
  14. void delete_dato(DATO* objeto) {
  15.    free(objeto);
  16. }
  17.  
  18. int get_dato(DATO* objeto) {
  19.    return objeto->miembro_privado;
  20. }
  21.  
  22. void set_dato(DATO* objeto, int valor) {
  23.    objeto->miembro_privado = valor;
  24. }



Ahora el cliente:

main.c
Código
  1. #include <stdio.h>
  2. #include "dato.h"
  3.  
  4. int main() {
  5.    DATO *d;
  6.  
  7.    d = new_dato();
  8.    set_dato(d, 5);
  9.    printf("%i\n", get_dato(d));
  10.  
  11.    /* d->miembro_privado = 4; /* <- Esto va a fallar */
  12.    /* printf("%i\n", get_dato(d)); */
  13.  
  14.    delete_dato(d);
  15.  
  16.    return 0;
  17. }
8  Foros Generales / Noticias / BASH Ubuntu sobre Windows 10... nativo en: 31 Marzo 2016, 09:44
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
9  Foros Generales / Sugerencias y dudas sobre el Foro / [SOLUCIONADO] El antihack de la página es demasiado restrictivo en: 8 Marzo 2016, 09:32
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?
10  Foros Generales / Sugerencias y dudas sobre el Foro / Cambiar texto GeSHi por algo más descriptivo en: 14 Febrero 2016, 22:01
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.
Páginas: [1] 2
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines