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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


  Mostrar Mensajes
Páginas: 1 ... 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 [139] 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 ... 161
1381  Programación / Programación C/C++ / Re: Ayuda con modificación de proyecto SDL en: 31 Marzo 2016, 00:26 am
El programa debe ser solo basado en GUI, y si es así, va a tocar modificar mucho del código fuente para trasladar todas las funciones y opciones que se pueden configurar a switches, una GUI en modo texto, etc.
La página web te recomienda usar el programa con una estación de trabajo en vez de en el servidor porque se presupone que el servidor trabajará sólo en modo texto.
1382  Programación / Programación C/C++ / Re: Ayuda con modificación de proyecto SDL en: 30 Marzo 2016, 08:24 am
Citar
Requirements
Logstalgia requires a video card supporting OpenGL. For this reason you should typically run Logstalgia on your workstation rather than on the web-server itself (unless your workstation is the web-server).

As Logstalgia is designed to playback logs in real time you will need a log from a fairly busy web-server to achieve interesting results (eg 100s of requests each minute).

An example access log is included.
Esto es lo que pone la web. Parece que tendrás que buscar otra aplicación.
1383  Programación / Programación C/C++ / Re: Ayuda Juego De la Vida-Conway graficos en: 29 Marzo 2016, 18:30 pm
Por lo que entiendo de tu código el control de las casillas vivas y muertas lo haces con el color de los píxeles.
Te sería más sencillo si separaras la lógica de la presentación: una tabla de X x X de bools o ints, según te vaya mejor.
Por otra parte el juego debe hacerse con dos tableros, uno con la representación y el otro será una copia para trabajar. Esto es así porqué el cálculo de la época actual debe hacerse según la época directamente anterior; si modificas la tabla de la que obtienes los datos el juego no tendrá el comportamiento esperado.
Debes tener en cuenta los límites del mundo: si estás calculando la esquina superior izquierda no puedes mirar que hay ni en la fila superior ni en la columna que está más a su izquierda porqué no existen, o puedes  juntar los límites haciendo que la izquierda se junte con la derecha y arriba con abajo.
1384  Programación / Programación C/C++ / Re: Meter en cadena argumento en C en: 29 Marzo 2016, 00:29 am
El problema es que haces strcpy con destino a un caracter, no a la dirección de inicio de un array de carácteres. Es decir:
Código
  1. strcpy(out[0], argv[i + 1]);
está mal.
out es el array, out[0] es un carácter (char).
lo que espera strcpy es
Código
  1. strcpy(out, argv[i+1]);
Y así con todos los demás arrays: in, pass y text.
1385  Programación / Programación C/C++ / Re: Pasar cifra numérica a letra en lenguaje C en: 28 Marzo 2016, 03:19 am
El problema es que quieres cambiar constantes.

Fíjate que todos tus arrays son de cadenas, son constantes que se guardan en la zona de memoria de sólo lectura del programa. Cualquier intento en cambiarlas producirá un error de fallo de segmento.
Pues eso es lo que estás haciendo en las líneas que has mencionado. Con la función toupper estás intentando cambiar la primera letra de una cadena constante y el propio S.O. te lo impide.

Para solucionar esto de forma sencilla: crea una variable dinámica del tamaño de la palabra que querías acceder, teniendo en cuenta que además debes dar cabida al carácter nulo; copia la cadena dentro de la nueva variable; haz lo que querías hacer pero usando esta nueva variable; libera la memoria adquirida para esta variable.

Código
  1. /*** recuerda incluir #include <string.h> para que funcione esta solución ***/
  2. char *s = malloc(strlen(decenas[tmp]+1) * sizeof(char));
  3. strcpy(s, decenas[tmp]);
  4. s[0] = toupper(s[0]);  
  5. printf( "\n %s", s);
  6. free(s);

O: crea una variable tipo char a la que meterás dentro el primer carácter de la cadena pero en mayúsculas; muestra por pantalla el contenido de esta variable; muestra por pantalla el contenido de la cadena a partir de la posición 1.

Código
  1. char m = toupper(decenas[tmp][0]);
  2. printf("%c%s", m, &decenas[tmp][1]);
1386  Programación / Programación C/C++ / Re: Programación de Minishell - Arreglar errores ¡POR FAVOR! en: 25 Marzo 2016, 15:59 pm
Muchos fallos tienen qur ver con arrays y sus elementos: haces asignaciones y comparacions a los arrays en vez de a los elementos que estoa guardan.
Por ejemplo pid es un array pero lo tratas como si fuera escalar en la orden
pid=fork()
1387  Programación / Programación C/C++ / Re: Problema C++ al enlazar en: 25 Marzo 2016, 01:11 am
Has puesto como argumento a la función,  el float, una variable que en verdad usas como local. Los argumentos no se deben usar para crear variables locales. Mal, queda aplazada la asignatura que cursas de C.
La llamada a la función espera a que le pases todos los argumentos que espera, el float incluido.
Otro: si haces promedio un float no hay razón por la que la función deba devolver un int.
Más: si todos los argumentos de una división són enteros C la considera una división entera y así guardará el resultado, aunque lo metas en un float.
1388  Programación / Programación C/C++ / Re: Duda con la función fgets (lenguaje C). en: 24 Marzo 2016, 12:02 pm
Te voy a mostrar una serie de programa de pruebas que te mostrarán el funcionamiento de fgets y lo que ocurre con el buffer stdin.

Es una buena idea realizar estos programas cuándo estudias programación para saber que ocurre en cada situación.

Este primero te enseñará qué copia desde stdin a tu buffer cuando le das a fgets un tamaño inferior al tamaño de tu buffer. En este caso tenemos un buffer de 5 elementos y fgets solo puede copiar 3.

Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. #define MAX_BUFF 5
  5.  
  6. void representar_char(int c) {
  7.    printf("%i", c);
  8.    if(isalnum(c))
  9.        printf(" -> \'%c\'", c);
  10.    else {
  11.        switch(c) {
  12.            case '\0':
  13.                printf("  -> \'\\0\'");
  14.                break;
  15.            case '\n':
  16.                printf(" -> \'\\n\'");
  17.                break;
  18.        }
  19.    }
  20. }
  21.  
  22. int main() {
  23.    char mi_buffer[MAX_BUFF];
  24.    int i;
  25.    printf(">> ");
  26.    fgets(mi_buffer, 3, stdin);
  27.    for(i = 0; i < MAX_BUFF; ++i) {
  28.        printf("mi_buffer[%i] : ", i);
  29.        representar_char(mi_buffer[i]);
  30.        putchar('\n');
  31.    }
  32.  
  33.    return 0;
  34. }
  35.  

Si al ejecutar de damos como cadena de entrada el carácter 'A' obtenemos esta salida:

Código:
>> A
mi_buffer[0] : 65 -> 'A'
mi_buffer[1] : 10 -> '\n'
mi_buffer[2] : 0  -> '\0'
mi_buffer[3] : -86
mi_buffer[4] : -2

Vemos que en primer lugar se guarda el carácter 'a', seguidamente el carácter de nueva línea '\n' y finalmente el caracter nulo '\0'. A partir del cuarto elemento, mi_buffer[3], lo que hay es basura.

Ahora, si le das como entrada la cadena "AB" verás el siguiente resultado:

Código:
>> AB
mi_buffer[0] : 65 -> 'A'
mi_buffer[1] : 66 -> 'B'
mi_buffer[2] : 0  -> '\0'
mi_buffer[3] : -80
mi_buffer[4] : -3

Como puedes ver no se ha guardado en el mi_buffer el carácter de nueva línea, que sigue existiendo en el buffer stdin, como veremos más adelante. Para corroborar que el último carácter a guardar siempre será un '\0' puedes repetir el programa esta vez con la cadena "ABC".

Código:
>> ABC
mi_buffer[0] : 65 -> 'A'
mi_buffer[1] : 66 -> 'B'
mi_buffer[2] : 0  -> '\0'
mi_buffer[3] : -13
mi_buffer[4] : -2

Ahora, para ver que queda en el buffer hay que modificar un poco el programa anterior.
Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. #define MAX_BUFF 5
  5.  
  6. void representar_char(int c) {
  7.    printf("%i", c);
  8.    if(isalnum(c))
  9.        printf(" -> \'%c\'", c);
  10.    else {
  11.        switch(c) {
  12.            case '\0':
  13.                printf("  -> \'\\0\'");
  14.                break;
  15.            case '\n':
  16.                printf(" -> \'\\n\'");
  17.                break;
  18.        }
  19.    }
  20. }
  21.  
  22. int main() {
  23.    char mi_buffer[MAX_BUFF];
  24.    int i;
  25.    char c;
  26.    printf(">> ");
  27.    fgets(mi_buffer, 3, stdin);
  28.    for(i = 0; i < MAX_BUFF; ++i) {
  29.        printf("mi_buffer[%i] : ", i);
  30.        representar_char(mi_buffer[i]);
  31.        putchar('\n');
  32.    }
  33.    while((c = getchar()) != '\n') {
  34.        printf("caracter en stdin : ");
  35.        representar_char(c);
  36.        putchar('\n');
  37.    }
  38.    printf("caracter en stdin : ");
  39.    representar_char(c);
  40.    putchar('\n');
  41.    return 0;
  42. }
  43.  

Si le damos como cadena de entrada "ABCDEFGHI" da el siguiente resultado:
Código:
>> ABCDEFGHI 
mi_buffer[0] : 65 -> 'A'
mi_buffer[1] : 66 -> 'B'
mi_buffer[2] : 0  -> '\0'
mi_buffer[3] : -79
mi_buffer[4] : -1
caracter en stdin : 67 -> 'C'
caracter en stdin : 68 -> 'D'
caracter en stdin : 69 -> 'E'
caracter en stdin : 70 -> 'F'
caracter en stdin : 71 -> 'G'
caracter en stdin : 72 -> 'H'
caracter en stdin : 73 -> 'I'
caracter en stdin : 10 -> '\n'

mi_buffer sigue recibiendo tantos caracteres como le hemos dicho a fgets, ver que uno de ellos es el carácter '\0' pues debe crear una cadena, lo demás se encuentra esperando en el buffer stdin.

Por último hay que ver que pasa si a fgets se le pasa un tamaño a copiar mayor que el tamaño de buffer de destino y la cadena a copiar también es mayor que el destino. Para ello modificamos de nuevo el programa:

Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. #define MAX_BUFF 5
  5.  
  6. void representar_char(int c) {
  7.    printf("%i", c);
  8.    if(isalnum(c))
  9.        printf(" -> \'%c\'", c);
  10.    else {
  11.        switch(c) {
  12.            case '\0':
  13.                printf("  -> \'\\0\'");
  14.                break;
  15.            case '\n':
  16.                printf(" -> \'\\n\'");
  17.                break;
  18.        }
  19.    }
  20. }
  21.  
  22. int main() {
  23.    char mi_buffer[MAX_BUFF];
  24.    int i;
  25.    char c;
  26.    printf(">> ");
  27.    fgets(mi_buffer, MAX_BUFF + 2, stdin);
  28.  
  29.    /* Qué hay dentro de mi_buffer */
  30.    for(i = 0; i < MAX_BUFF; ++i) {
  31.        printf("mi_buffer[%i] : ", i);
  32.        representar_char(mi_buffer[i]);
  33.        putchar('\n');
  34.    }
  35.  
  36.    /* Cuidado aquí, esta parte de la memoria está fuera de todo contro */
  37.    for(i = MAX_BUFF; i < MAX_BUFF + 2; ++i) {
  38.        printf("*** mi_buffer[%i] : ", i);
  39.        representar_char(mi_buffer[i]);
  40.        putchar('\n');
  41.    }
  42.  
  43.    /* Qué hay en stdin */
  44.    while((c = getchar()) != '\n') {
  45.        printf("caracter en stdin : ");
  46.        representar_char(c);
  47.        putchar('\n');
  48.    }
  49.    printf("caracter en stdin : ");
  50.    representar_char(c);
  51.    putchar('\n');
  52.    return 0;
  53. }
  54.  

Al pasarle la cadena ABCDEFGHIJKL al programa obtenemos:

Código:
>> ABCDEFGHIJKL
mi_buffer[0] : 65 -> 'A'
mi_buffer[1] : 66 -> 'B'
mi_buffer[2] : 67 -> 'C'
mi_buffer[3] : 68 -> 'D'
mi_buffer[4] : 69 -> 'E'
*** mi_buffer[5] : 70 -> 'F'
*** mi_buffer[6] : 0  -> '\0'
caracter en stdin : 71 -> 'G'
caracter en stdin : 72 -> 'H'
caracter en stdin : 73 -> 'I'
caracter en stdin : 74 -> 'J'
caracter en stdin : 75 -> 'K'
caracter en stdin : 76 -> 'L'
caracter en stdin : 10 -> '\n'

Se puede ver que fgets sigue cumpliendo su trabajo, copia tantos caracteres como le hemos dicho, ha desbordado mi_buffer, pero trabaja como se espera de él. Los datos en marcados en *** están fuera de todo control y podrían darse otras situaciones como el cierre del programa, cuelgue del sistema, etc.
Para terminar se sigue viendo en en stdin está el resto de la cadena que no se ha copiado.
1389  Programación / Programación C/C++ / Re: [C][?] No se ejecutan printf en: 23 Marzo 2016, 22:34 pm
Fallos en tu código:
Línea 60
Código
  1. for(p = 0; p = x; p++)
Línea 65
Código
  1. for(p = x; p = 0; p--)
Estos fors están mal formulados, como puedes ver donde debe haber la comparación hay una asignación.

Por cierto, haciendo uso de operadores adecuados, como el de desplazamientos de bits y evitando funciones redundantes como la imprimeResultado y clean_stdin puedes reducir el tamaño del código menos de la mitad.
1390  Programación / Programación C/C++ / Re: [C][?] No se ejecutan printf en: 23 Marzo 2016, 18:04 pm
A mi me funciona el código.

A decir verdad me he inventado código para las funciones que no muestras, a lo mejor el problema está allí.

¿Porqué no muestras el código entero, #includes incluidos?

Por cierto, para escribir mensajes de error o cadenas de control para depurar el programa mejor hacerlo con fprintf(stderr, cadena_mensaje_error, ...);

La razón es que la escritura a stderr se muestra directamente por pantalla o donde sea que apunte stderr, mientras que si se escribe a stdout el mensaje se guarda en búffer y C lo libera cuándo cree conveniente. Y eso es la razón de la existencia de fflush(descriptor_del_flujo_de_salida), para forzar que se libere el buffer de forma inmediata.
Páginas: 1 ... 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 [139] 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 ... 161
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines