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

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


  Mostrar Mensajes
Páginas: 1 ... 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 [101] 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 ... 161
1001  Programación / Programación C/C++ / Re: no tiene sentido este simple código. en: 26 Enero 2017, 09:33 am
Es muy raro. Tanto 5 como 25 tiene una cantidad muy baja de bits como para que se pierda información.
1002  Programación / Programación C/C++ / Re: macros en C en: 25 Enero 2017, 18:43 pm
Si tu compilador es gcc o g++ puedes ver el archivo generado, con las macros expandidas si compilas con la opción -E. Para verlo con tranquilidad lleva llévalo a un archivo:

Código:
gcc -E fuente.c > expandido.c
sinedo fuente.c el nombre de tu archivo fuente.
1003  Programación / Programación C/C++ / Re: macros en C en: 24 Enero 2017, 23:53 pm
En principio las macros solo se escriben en una única línea pero se usa la barra invertida para indicar al preprocesador que ésta continua en la linea siguiente.

Los datos de los parámetros se pasan literalmente: lo que tu escribas en el parámetro de llamada es lo mismo que va a usar la macro en su conversión.

Las llaves también aparecen en el código final cuando la macro se expande.

Las macros tienen el operado # y ## que convierte en cadena el parámetro y convierte en cadena dos parámetros y los une respectivamente. Se pueden hacer cosas muy interesantes con eso.

Para intercambiar dos valores, sin tener que usar una variable auxiliar puedes usar.
A ^= B;
B ^= A;
A ^= B;
1004  Programación / Programación C/C++ / Re: funcion que devuelve un puntero de una variable static en: 24 Enero 2017, 23:28 pm
Entiendo, aunque voy a decir que no es una técnica que me gusta mucho. Veo una fuga de memoria si el puntero es a un array dinámico y no se libera la memoria al final del programa (para sistemas donde el kernel no libere la memoria dinámica del programa cuándo este termine).


Edito:
Una solución es usando un array estático, así el programa limpia la memoria con normalidad. Por contra se debe pensar bien la cantidad de memoria a usar de antemano.


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <limits.h>
  5.  
  6.  
  7. char * itoa(int num) {
  8.    static char retval[12];
  9.    size_t size;
  10.    int negativo = num < 0;
  11.    unsigned n = (unsigned)abs(num);
  12.  
  13.    size = (n? log10(n) : 0) + 1 + negativo;
  14.  
  15.    if(negativo)
  16.        retval[0] = '-';
  17.  
  18.    retval[size--] = '\0';
  19.  
  20.    do {
  21.        retval[size--] = n%10 + '0';
  22.        n /= 10;
  23.    } while(n);
  24.  
  25.    return retval;
  26. }
  27.  
  28. int main() {
  29.    printf("%s\n", itoa(INT_MAX));
  30.    printf("%s\n", itoa(0));
  31.    printf("%s\n", itoa(INT_MIN));
  32. }
1005  Programación / Programación C/C++ / Re: funcion que devuelve un puntero de una variable static en: 24 Enero 2017, 20:49 pm
Vale, pues entonces ahora mismo no entiendo qué es lo que se pretende.

A ver un ejemplo.
1006  Programación / Programación C/C++ / Re: [c++] ayuda con modulo de juego de trablero en: 24 Enero 2017, 19:27 pm
Partiendo de tu sistema de referencia (arriba a la izquierda, abajo a la izquierda) posiciónate sobre la casilla de inicio de tu figura y a partir de ella recorre las casillas de tu tablero que ocuparía la figura.

Por ejemplo. Tomando la casilla [0,0] la de arriba a la izquierda.
Código:
OOOOO
O#OOO
O#OOO
O#OOO
O###O
Tu figura empezaría en la casilla [1,1] y ocuparía [2,1], [3,1], [4,1], [4,2], [4,3].
Tu figura tendrá la información de que casillas ocupa de forma relativa o cuántas, como quieras hacerlo. Usando ese dato y sumado a la casilla de inicio de la figura sabrás qué ocupa de forma global.

Espero haberme explicado bien.
1007  Programación / Programación C/C++ / Re: Forma de evaluación de los operandos de un operador. en: 24 Enero 2017, 15:47 pm
Vale, eso son los puntos de secuencia.

Un punto de secuencia marca cuándo una instrucción se ha completado y no va a haber efectos secundarios en posteriores procesos.

Como has dicho el operador de asignación ( = ) no marca un punto de secuencia por lo que el compilador puede elegir arbitrariamente que parte del igual quiere resolver primero. Si es la parte izquierda no pasará nada, se dereferenciará la dirección de la variable a[i] y después pasará a la parte derecha para calcular el valor que debe asignar, por lo que el postincremento no afectará. Pero si primero decide evaluar la parte derecha para saber qué valor debe asignar, al evaluar la parte izquierda i habrá aumentado por el postincremento.

Si buscas más información sobre efectos secundarios y puntos de secuencia (sequence points) verás que la historia es bastante complicada. Basta con que te quedes que no hay que mezclar según que expresiones en una instrucción.
1008  Programación / Programación C/C++ / Re: funcion que devuelve un puntero de una variable static en: 24 Enero 2017, 10:08 am
La idea del static es que el dato se mantenga de llamada a llamada pero solo sea accesible para esa función. Si sabes que debes usar ese dato fuera de la función hazlo global.
1009  Programación / Programación C/C++ / Re: Formas de guardar en una matriz de char un string en: 24 Enero 2017, 09:21 am
Creo entender el problema:
Se te queda el carácter '\n' en el buffer después de capturar con scanf y cuando llegas a fgets este recoge el '\n' y regresa.

Soluciona esto con un
Código
  1. while(getchar() != '\n');
después del scanf.
Hay otras formas, pero esta es una de las mas fáciles.
1010  Programación / Programación C/C++ / Re: ayuda con un codigo en: 24 Enero 2017, 00:22 am
A ver si te sirve esto. Está en C, compila en GCC.
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void crear_lista(char ***lista, const char *origen) {
  6.    char *palabra;
  7.    char **l;
  8.    char *delimitadores = " \t";
  9.    char *copia;
  10.    unsigned i = 0;
  11.  
  12.    // Guarda para saber si origen está vacío.
  13.    if(origen == NULL) {
  14.        *lista = NULL;
  15.        return;
  16.    }
  17.  
  18.    // Una copia no constante de origen para strtok
  19.    copia = malloc((strlen(origen) + 1) * sizeof(char));
  20.    strcpy(copia, origen);
  21.  
  22.    // Se saca la primera palabra de origen
  23.    palabra = strtok(copia, delimitadores);
  24.  
  25.    // Se genera espacio para guardar un elemento en la lista
  26.    l = malloc(sizeof(char *));
  27.  
  28.    // Se genera espacio para guardar la primera palabra...
  29.    l[i] = malloc((strlen(palabra)+1) * sizeof(char));
  30.    // y se guarda
  31.    strcpy(l[i], palabra);
  32.  
  33.    // Se avanza el puntero de la lista en una posición
  34.    ++i;
  35.  
  36.    // Mientras queden palabas en origen
  37.    while((palabra = strtok(NULL, delimitadores))) {
  38.        // Se repiten los pasos anteriores. El uso de realloc
  39.        // es por que se redimensiona la lista.
  40.        l = realloc(l, sizeof(char *) * i+1);
  41.        l[i] = malloc((strlen(palabra)+1) * sizeof(char));
  42.        strcpy(l[i], palabra);
  43.        ++i;
  44.    }
  45.  
  46.    // Se libera la variable copia.
  47.    free(copia);
  48.  
  49.    // Para terminar una última redimensión...
  50.    l = realloc(l, sizeof(char *) * i+1);
  51.    // para alojar el valor nulo que marca el fin de la lista.
  52.    l[i] = NULL;
  53.  
  54.    // Se guarda la lista en la variable del parámetro de la función.
  55.    *lista = l;
  56. }
  57.  
  58. void liberar_lista(char ***lista) {
  59.    int i;
  60.  
  61.    // Si no hay nada que liberar regresa.
  62.    if(!*lista) return;
  63.  
  64.    // Por cada elemento en la lista...
  65.    for(i = 0; lista[i]; ++i)
  66.        // liberar esa posición.
  67.        free((*lista)[i]);
  68.  
  69.    // Se libera la lista.
  70.    free(*lista);
  71.  
  72.    // Se marca nula la lista en la variable
  73.    // del parámetro de la función y así indicar
  74.    // que dicha variable está libre para usarse
  75.    // de nuevo.
  76.    *lista = NULL;
  77. }
  78.  
  79. int main() {
  80.    const char *s = "cadena_uno cadena_dos cadena_tres cadena_cuatro cadena_cinco";
  81.    char **ss;
  82.    int i;
  83.  
  84.    crear_lista(&ss, s);
  85.  
  86.    for(i = 0; ss[i]; ++i)
  87.        printf("%s\n", ss[i]);
  88.  
  89.    liberar_lista(&ss);
  90. }
Páginas: 1 ... 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 [101] 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 ... 161
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines