Ver Mensaje Individual
  #10 (permalink)  
Antiguo 19/11/2015, 07:38
aguml
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 10 meses
Puntos: 3
Respuesta: problema con juego de palabras

Estoy haciendo una prueba como dije pero a veces funciona bien y retrocede para cambiar de palabra y buscar la siguiente y a veces falla al reallocar la memoria. La verdad es que me tiene loco y no se donde puede estar el fallo. Como lo tengo, cuando funciona, obtengo la combinacion rapidisimo, vamos al instante. El caso es que, a veces, da una excepcion al reallocar memoria y dice algo asi como que intento escribir en una direccion no valida. ¿puedes indicarme donde esta el fallo? Lo de lista circulares... bueno, no se ni por donde empezar ya que primero supongo que tendria que funcionar mi codigo, luego crear una lista enlazada en la que voy añadiendo todas las combinaciones validas, y por ultimo simplemente obtener un puntero al azar de esa lista pero si no funciona primero mi codigo no se por donde seguir. Esto es lo que tengo:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. #define MIN_LEVEL 4
  7. #define MAX_LEVEL 9
  8. #define SIZE 10
  9. //-----------------------------------------------------------------------------
  10.  
  11. typedef struct PRIMERA{
  12.    char Palabra[SIZE];
  13. }Primera;
  14.  
  15. typedef struct PALABRA{
  16.    char Palabra[SIZE];
  17.    int PosCaracterExtra;
  18. }Palabra;
  19.  
  20. typedef struct LISTA_PALABRAS{
  21.    Palabra *Palabras;
  22.    int nEncontradas;
  23. }ListaPalabras;
  24.  
  25. typedef struct COMBINACION{
  26.    Primera cuatroLetras;
  27.    ListaPalabras cincoLetras;
  28.    ListaPalabras seisLetras;
  29.    ListaPalabras sieteLetras;
  30.    ListaPalabras ochoLetras;
  31.    ListaPalabras nueveLetras;
  32. }Combinacion;
  33. //-----------------------------------------------------------------------------
  34.  
  35. int SearchFirstWord(char *word);
  36. int SearchNextWords(char *word,int length,ListaPalabras *Lista);
  37. int ShowFirst(char *word);
  38. void ShowMask(char *word,int length,int posCharExtra,int nCaracteresAMostrar);
  39. void RandomCharsOfWord(char *word,char *result,int length);
  40. void EliminarPalabra(ListaPalabras *Lista,int pos);
  41. //-----------------------------------------------------------------------------
  42.  
  43. int main ()
  44. {
  45.    char entrada[SIZE];
  46.    int posCaracterExtra;
  47.    int i,largo,encontrada,salir=0;
  48.    int selCincoLetras,selSeisLetras,selSieteLetras,selOchoLetras,selNueveLetras;
  49.    Combinacion combinacion;
  50.  
  51.    srand(time(NULL));
  52.  
  53.    do{
  54.       SearchFirstWord(combinacion.cuatroLetras.Palabra);
  55.       combinacion.cincoLetras.nEncontradas=0;
  56.       combinacion.cincoLetras.Palabras=NULL;
  57.       combinacion.seisLetras.nEncontradas=0;
  58.       combinacion.seisLetras.Palabras=NULL;
  59.       combinacion.sieteLetras.nEncontradas=0;
  60.       combinacion.sieteLetras.Palabras=NULL;
  61.       combinacion.ochoLetras.nEncontradas=0;
  62.       combinacion.ochoLetras.Palabras=NULL;
  63.       combinacion.nueveLetras.nEncontradas=0;
  64.       combinacion.nueveLetras.Palabras=NULL;
  65.       largo=4;
  66.       if(SearchNextWords(combinacion.cuatroLetras.Palabra,largo,&combinacion.cincoLetras) > 0){
  67.          ShowFirst(combinacion.cuatroLetras.Palabra);
  68.          do{
  69.             printf("Palabras siguientes validas: ");
  70.             for(i=0;i<combinacion.cincoLetras.nEncontradas;i++)
  71.                printf("%s ",combinacion.cincoLetras.Palabras[i].Palabra);
  72.             selCincoLetras=rand()%combinacion.cincoLetras.nEncontradas;
  73.             printf("\nPalabra seleccionada al azar: %s\n",combinacion.cincoLetras.Palabras[selCincoLetras].Palabra);
  74.             largo=5;
  75.             if(SearchNextWords(combinacion.cincoLetras.Palabras[selCincoLetras].Palabra,largo,&combinacion.seisLetras) > 0){
  76.                do{
  77.                   printf("Palabras siguientes validas para la seleccionada: ");
  78.                   for(i=0;i<combinacion.seisLetras.nEncontradas;i++)
  79.                      printf("%s ",combinacion.seisLetras.Palabras[i].Palabra);
  80.                   selSeisLetras=rand()%combinacion.seisLetras.nEncontradas;
  81.                   printf("\nPalabra seleccionada al azar: %s\n",combinacion.seisLetras.Palabras[selSeisLetras].Palabra);
  82.                   largo=6;
  83.                   if(SearchNextWords(combinacion.seisLetras.Palabras[selSeisLetras].Palabra,largo,&combinacion.sieteLetras) > 0){
  84.                      do{
  85.                         printf("Palabras siguientes validas para la seleccionada: ");
  86.                         for(i=0;i<combinacion.sieteLetras.nEncontradas;i++)
  87.                            printf("%s ",combinacion.sieteLetras.Palabras[i].Palabra);
  88.                         selSieteLetras=rand()%combinacion.sieteLetras.nEncontradas;
  89.                         printf("\nPalabra seleccionada al azar: %s\n",combinacion.sieteLetras.Palabras[selSieteLetras].Palabra);
  90.                         largo=7;
  91.                         if(SearchNextWords(combinacion.sieteLetras.Palabras[selSieteLetras].Palabra,largo,&combinacion.ochoLetras) > 0){
  92.                            do{
  93.                               printf("Palabras siguientes validas para la seleccionada: ");
  94.                               for(i=0;i<combinacion.ochoLetras.nEncontradas;i++)
  95.                                  printf("%s ",combinacion.ochoLetras.Palabras[i].Palabra);
  96.                               selOchoLetras=rand()%combinacion.ochoLetras.nEncontradas;
  97.                               printf("\nPalabra seleccionada al azar: %s\n",combinacion.ochoLetras.Palabras[selOchoLetras].Palabra);
  98.                               largo=8;
  99.                               if(SearchNextWords(combinacion.ochoLetras.Palabras[selOchoLetras].Palabra,largo,&combinacion.nueveLetras) > 0){
  100.                                  printf("Palabras siguientes validas para la seleccionada: ");
  101.                                  for(i=0;i<combinacion.nueveLetras.nEncontradas;i++)
  102.                                     printf("%s ",combinacion.nueveLetras.Palabras[i].Palabra);
  103.                                  selNueveLetras=rand()%combinacion.nueveLetras.nEncontradas;
  104.                                  printf("\nPalabra seleccionada al azar: %s\n",combinacion.nueveLetras.Palabras[selNueveLetras].Palabra);
  105.                                  encontrada=1;
  106.                                  free(combinacion.nueveLetras.Palabras);
  107.                                  combinacion.nueveLetras.nEncontradas=0;
  108.                                  salir=1;
  109.                               }else{
  110.                                  printf("No se encontro una palabra valida de 9 letras\n");
  111.                                  EliminarPalabra(&combinacion.ochoLetras,selOchoLetras);
  112.                               }
  113.                            }while(salir == 0 &&combinacion.nueveLetras.nEncontradas < 1 && combinacion.ochoLetras.nEncontradas > 0);
  114.                            free(combinacion.ochoLetras.Palabras);
  115.                            combinacion.ochoLetras.nEncontradas=0;
  116.                            if(salir==0)
  117.                               EliminarPalabra(&combinacion.sieteLetras,selSieteLetras);
  118.                         }else{
  119.                            printf("No se encontro una palabra valida de 8 letras\n");
  120.                            EliminarPalabra(&combinacion.sieteLetras,selSieteLetras);
  121.                         }
  122.                      }while(salir == 0 && combinacion.ochoLetras.nEncontradas < 1 && combinacion.sieteLetras.nEncontradas > 0);
  123.                      free(combinacion.sieteLetras.Palabras);
  124.                      combinacion.sieteLetras.nEncontradas=0;
  125.                      if(salir==0)
  126.                         EliminarPalabra(&combinacion.seisLetras,selSeisLetras);
  127.                   }else{
  128.                      printf("No se encontro una palabra valida de 7 letras\n");
  129.                      EliminarPalabra(&combinacion.seisLetras,selSeisLetras);
  130.                   }
  131.                }while(salir == 0 && combinacion.sieteLetras.nEncontradas < 1 && combinacion.seisLetras.nEncontradas > 0);
  132.                free(combinacion.seisLetras.Palabras);
  133.                combinacion.seisLetras.nEncontradas=0;
  134.                if(salir==0)
  135.                   EliminarPalabra(&combinacion.cincoLetras,selCincoLetras);
  136.             }else{
  137.                printf("No se encontro una palabra valida de 6 letras\n");
  138.                EliminarPalabra(&combinacion.cincoLetras,selCincoLetras);
  139.             }
  140.          }while(salir == 0 && combinacion.seisLetras.nEncontradas < 1 && combinacion.cincoLetras.nEncontradas > 0);
  141.          free(combinacion.cincoLetras.Palabras);
  142.          combinacion.cincoLetras.nEncontradas=0;
  143.       }else{
  144.          printf("No se encontro una palabra valida de 5 letras\n");
  145.       }
  146.    }while(salir == 0 && combinacion.cincoLetras.nEncontradas < 1);
  147.    system("PAUSE");
  148.    return 0;
  149. }
  150. //-----------------------------------------------------------------------------