• Domingo 5 de Mayo de 2024, 02:31

Autor Tema:  Juego de palabras  (Leído 2247 veces)

badyalberto

  • Miembro activo
  • **
  • Mensajes: 77
    • Ver Perfil
Juego de palabras
« en: Jueves 9 de Abril de 2009, 16:08 »
0
Código: C++
  1.  
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<time.h>
  5.  
  6. #define LONGITUD 50
  7. #define TEMPS 60
  8. #define TOP 5
  9.  
  10. char *paraules[]={"llibre","mantega","carrer","pernil","pilota"};
  11.  
  12. char top_noms[TOP][LONGITUD];
  13. int top_punts[TOP];
  14.  
  15. int main()
  16. {
  17.     int i,n,num;
  18.     int encerts;
  19.    
  20.     char resposta[LONGITUD];
  21.     time_t t;
  22.    
  23.     srand(time(NULL));
  24.     for(i=0;i<TOP;i++)
  25.         top_punts[i]=-1;
  26.     n=sizeof(paraules)/sizeof(char*);
  27.     do
  28.     {
  29.          printf("nnEntra les paraules que van sortintn");
  30.          t=time(NULL);
  31.          while(difftime(time(NULL),t)<TEMPS)
  32.          {
  33.                num=rand()%num;
  34.                puts(paraules[num]);
  35.                gets(resposta);
  36.                if(strcmp(resposta,paraules[num])==0)
  37.                {
  38.                     if(difftime(time(NULL),t)<TEMPS)
  39.                     {
  40.                          encerts++;
  41.                          puts("OKn");
  42.                     }
  43.                     else
  44.                         puts("Fora de Tempsn");
  45.                }
  46.                else
  47.                    puts("Errorn");
  48.          }
  49.          printf("Continuar(si/no)?n");
  50.          gets(resposta);
  51.     }while(strcmp(resposta,"si")==0);
  52.    
  53. getchar();
  54. getchar();
  55. }
  56.  
  57.  

Alguien sabe pq al ejecutarlo se me cierra.
Este codigo no lo e hecho yo, sino que lo colgado la profe y nosotros tenemos q añadirle dos funciones: una crea el ranking, la otra lo printa.-

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Juego de palabras
« Respuesta #1 en: Jueves 9 de Abril de 2009, 16:30 »
0
No se ni como lo compilas tal y como esta ahi ... para usar strcmp necesitas incluir string.h.

Se cierra al dar una excepcion, el VC++ ya advierte de algo raro en esta linea al estar usando una variable sin inicializar:
num=rand()%num;

El problema es que num se usa inmediatamente despues en:
puts(paraules[num]);

¿Que pasa si num era 4500 y rand devuelve 123456? Que num es 1956 ... ¿Y si inicializamos num a 0?  :blink:

Asi que mejor limitarlo al numero de palabras existentes:
num = rand() % (sizeof(paraules) / sizeof(paraules[0]));

Fijate que encerts es incrementado sin ser inicializado con lo cual arranca con vaya uno a saber que valor ...

PD. O este codigo esta hecho mal adrede o la profesora sabe tanto de programacion como yo de corte y confeccion.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

gonza_fs

  • Nuevo Miembro
  • *
  • Mensajes: 24
    • Ver Perfil
Re: Juego de palabras
« Respuesta #2 en: Sábado 11 de Abril de 2009, 03:23 »
0
Que tal. Mira, si la solucion anterior que te dieron no resulta, el error esta dentro del do-while o dentro del segundo while. Supongo por como lo enunciaste, que el programa se te cierra solo sin advertencias ni nada. Si es asi, lo que esta pasando es que la pila de ejecucion se llena al ejecutar un bucle que no corta, y simplemente se sale. El problema puede ser tambien, debido al compilador usado. Por ahi a vos te pasa eso y en otro compilador distinto funciona. Habria que saber como maneja tu compilador el tratado de los string. Yo usando dev y builder tuve varios de estos problemas con caracteres. Espero te sirva, suerte.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Juego de palabras
« Respuesta #3 en: Sábado 11 de Abril de 2009, 10:09 »
0
gonza_fs: la pila no aumenta en cada pasada, no es una funcion recursiva ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

gonza_fs

  • Nuevo Miembro
  • *
  • Mensajes: 24
    • Ver Perfil
Re: Juego de palabras
« Respuesta #4 en: Sábado 11 de Abril de 2009, 17:30 »
0
Quien dijo que la pila se llena solo con recursion? la pila se llena con toda la informacion de un programa. La recursion solo hace que se llene mas rapido, pero eso no significa que si no hay recursion la pila no se llene. Esto tambien depende de como administra la memoria el compilador, variables globales, estaticas, etc. La cosa es que no es solo cuestion de tirar codigo sin pensar en lo que pasa con la memoria. Por eso este tipo de problemas y otros relacionados.
Igual, lo que dije quiza no es la solucion al problema, pero solo contesto a algo que quiza no tuviste en cuenta. Saludos.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Juego de palabras
« Respuesta #5 en: Sábado 11 de Abril de 2009, 23:06 »
0
¿Y como esperas que la pila se llene en este caso? Por favor explicalo, que sucede en cada pasada de alguno de esos bucles (tampoco especificas en cual) que aumenta el consumo de la pila.

Y no, la pila no se llena con toda la informacion de un programa ni por la mas minima casualidad, para algo existen las secciones de codigo, datos, datos de solo lectura, etc. La recursion no hace que sea mas rapido sino que al ser una llamda tras otra se van acumulando todas las variables locales de la funcion y los frames o al menos direcciones de retorno. Las variables globales o estaticas no van en la pila JAMAS, la pila es volatil. La cosa es que no es solo cuestion de hablar por hablar, antes hay que documentarse.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

gonza_fs

  • Nuevo Miembro
  • *
  • Mensajes: 24
    • Ver Perfil
Re: Juego de palabras
« Respuesta #6 en: Sábado 11 de Abril de 2009, 23:59 »
0
Mira, creo que ya estas llevando el tema para otro lado, yo como cualquiera que lee, aporte mi opinion. Ya que mencionas la frase "hablar por hablar", podemos aclarar un par de cosas. Primero no hay que tomar todo al pie de la letra. Porque sino, yo podria decirte que no afirmaria que la pila es "volatil". Si vamos con el criterio de explicar todo bien perfectamente, esa no es la palabra correcta para describir la pila de ejecucion. Si queres podemos diferenciar entre pila y heap. La pila de ejecucion de un programa no es solo la pila como tal, sino que lleva un bloque por debajo denominado heap, que en conjunto con la pila forman todo el bloque. A eso considero yo pila de ejecucion, y tomado desde ese punto las variables globales si van en la pila de ejecucion, debajo del heap, incluso antes de arrancar el programa ya estan consumiendo memoria de ese bloque. Si consideras aparte que este bloque de ejecucion es un bloque fijo que no cambia de tamaño, se puede rebalsar. Todo esto hablamos sin saber las cuestiones de manejo del compilador.
Igual ya nos fuimos del tema, solo queria aclararte esto que creo que lo estamos viendo desde dos puntos diferentes. Solo eso, saludo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Juego de palabras
« Respuesta #7 en: Domingo 12 de Abril de 2009, 00:15 »
0
Cita de: "gonza_fs"
Mira, creo que ya estas llevando el tema para otro lado, yo como cualquiera que lee, aporte mi opinion.

No, el que lleva el tema para otro lado y no señala como puede ser que haya un stack overflow en este codigo sos vos. Y las opiniones no tienen mucha utilidad en este caso si no tienen ningun fundamento, como la tuya estaba ERRADA yo lo señale.

Cita de: "gonza_fs"
Ya que mencionas la frase "hablar por hablar", podemos aclarar un par de cosas. Primero no hay que tomar todo al pie de la letra. Porque sino, yo podria decirte que no afirmaria que la pila es "volatil".

Si, hablas por hablar pibe, incluso en este caso, por algo use la italica para poner volatil, no es algo muy complicado de entender, las variables que van en la pila son las locales; documentate.

Cita de: "gonza_fs"
Si vamos con el criterio de explicar todo bien perfectamente, esa no es la palabra correcta para describir la pila de ejecucion.

La pila es una sola, se usa para mas de una cosa; documentate.

Cita de: "gonza_fs"
Si queres podemos diferenciar entre pila y heap.

Si, claro que queremos hacerlo, el heap es otra cosa ... documentate.

Cita de: "gonza_fs"
La pila de ejecucion de un programa no es solo la pila como tal, sino que lleva un bloque por debajo denominado heap, que en conjunto con la pila forman todo el bloque.

No, el heap (monticulo) es el area de memoria dinamica; documentate.

Cita de: "gonza_fs"
A eso considero yo pila de ejecucion, y tomado desde ese punto las variables globales si van en la pila de ejecucion, debajo del heap, incluso antes de arrancar el programa ya estan consumiendo memoria de ese bloque.

No importa lo que vos consideres, las variables globales van en la seccion de datos o datos de solo lectura, no en la pila, documentate. El heap es otra cosa ... documentate.

Cita de: "gonza_fs"
Si consideras aparte que este bloque de ejecucion es un bloque fijo que no cambia de tamaño, se puede rebalsar.

Si, cosa que no es el heap justamente; documentate.

Cita de: "gonza_fs"
Todo esto hablamos sin saber las cuestiones de manejo del compilador.

Mejor habla por vos mismo.

Cita de: "gonza_fs"
Igual ya nos fuimos del tema, solo queria aclararte esto que creo que lo estamos viendo desde dos puntos diferentes. Solo eso, saludo.

No, el que se fue de tema fuiste vos desde que entraste a este hilo, hacete un favor: COMPILA EL CODIGO Y DEPURALO. Despues lee bastante asi la proxima vez que alguien te señale un error no te haces el guacho pistola y quedas como un flor de pelotudo. Y por si me falto decirlo: documentate.

http://en.wikipedia.org/wiki/Stack_overflow
http://en.wikipedia.org/wiki/Call_stack
http://en.wikipedia.org/wiki/Heap

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.