marcelogarberoglio / PI

Para realizar consultas
5 stars 0 forks source link

Ej7_Guia8 #34

Closed romamati closed 2 years ago

romamati commented 2 years ago

Buenas! Me gustaría saber por qué mi código no funciona. Desde ya muchas gracias.

include

include

define FILS 4

define COLS 4

define DIRECCIONES 8

typedef enum {DER=0, IZQ, ABA, ARR, I_AR, I_AB, D_AR, D_AB } Tdireccion;

typedef struct{ char * palabra; size_t fila; size_t columna; Tdireccion direccion; }Posicion;

Posicion buscarEnDir(char sopa[][COLS], char palabra, int pos_i, int pos_j); Posicion resolverSopa(char sopa[][COLS], char * diccionario[]);

int main(void) { char * diccionario[] = {"ARRE", "CANCION", "CAPA", "ERROR", "ORCO", "PERRO", "PERTINAZ", "REA", "RIO", ""};

char sopa[FILS][COLS] = 
{
  {'X','X','X','O','X','X','X'},
  {'A','P','A','C','Y','Y','O'},
  {'Z','E','Z','R','Z','C','X'},
  {'E','R','R','O','R','X','X'},
  {'X','R','I','O','I','E','X'},
  {'X','O','X','X','O','X','X'}
};

Posicion * rta = resolverSopa(sopa, diccionario);

for(int i = 0; rta[i].palabra != NULL; i++){
    printf("{%s, %zu, %zu, %d}\n", rta[i].palabra, rta[i].fila, rta[i].columna, rta[i].direccion);
}
free(rta);

}

Posicion buscarEnDir(char sopa[][COLS], char palabra, int pos_i, int pos_j) / char palabra seria la direccion donde esta la palabra. Lo pongo asi para que asi luego le pueda pasar diccionario[pos] como parametro/ { Posicion Data;/ Aca voy a almacenar toda la info si se encuentra la palabra/ int Inc_i, Inc_j,m, aux_i, aux_j, w, flag, encontrada = 0; char Dir_i[] = {0,0,-1,1,-1,-1,1,1};/ En Dir_i tengo los distintos incrementos que le tengo que hacer a la i segun la direccion en la que me muevo/ char Dir_j[] = {1,-1,0,0,1,-1,1,-1};/ En Dir_j tengo los distintos incrtementos que le tengo que hacer a la j segun la direccion en la que me muevo/

for(m = 0; m<DIRECCIONES && !encontrada; m++)/*voy asignando los incrementos correspondientes segun la direccion en la que me voy a mover*/
{
    Inc_i = Dir_i[m];
    Inc_j = Dir_j[m];

    for(int i = pos_i ; i<FILS ; i++) /* pos_i seria la fila de mi sopa donde empiezo a buscar*/
    {
        for(int j = pos_j; j<COLS; j++)/* pos_j seria la columna de mi sopa donde empiezo a buscar*/
        {
            aux_i = i;
            aux_j= j;
            for( flag = 0,w = 0; palabra[w] != 0 && aux_i>= 0 && aux_i<FILS && aux_j >= 0 && aux_j<COLS && !flag; w++, aux_i+=Inc_i, aux_j+=Inc_j )
            {
                if(palabra[w] != sopa[aux_i][aux_j])

                {
                    flag = 1;
                }
            }
        }
    }
    if(!flag) /* Si sale del ultimo for y el flag sigue apagado es porque encontro la palabra en esa direccion*/
            {
                encontrada = 1;
                Data.palabra = palabra;
                Data.fila = pos_i;
                Data.columna = pos_j;
                Data.direccion = ((Inc_i ==0 && Inc_j ==1)? DER : (Inc_i ==0 && Inc_j ==-1)? IZQ : (Inc_i ==-1 && Inc_j ==0)? ARR : (Inc_i ==1 && Inc_j ==0)? ABA : (Inc_i ==-1 && Inc_j ==1)?D_AR : (Inc_i ==-1 && Inc_j ==-1)?I_AR : (Inc_i ==1 && Inc_j ==-1)?I_AB : D_AB );
            }
}

if(!encontrada) /* Si ya busco en todas las direcciones posibles a partir de la posicion inicial pasada por parametro y no la encontro entonces lo marco poniendo que la direccion en mi data sea -1 la cual es una direccion inexistente*/
{
    Data.direccion = -1;
}
return Data;

}

Posicion resolverSopa(char sopa[][COLS], char diccionario[]) { Posicion vector_Data = NULL; Posicion Data; int cant_encontradas = 0; for(int k = 0 ; diccionario[k][0] != 0; k++)/ Con esto voy a ir pasando de palabra/ { for(int i = 0; i<FILS; i++) { for(int j = 0 ; j<COLS; j++) { if(sopa[i][j] == diccionario[k][0])/ De esta forma solo va a empezar a buscar en la posicion de la sopa donde encuentra la primer letra de la palabra a buscar*/ { Data = buscarEnDir(sopa,diccionario[k],i,j); }

            if(Data.direccion != -1)/* Si pasa esto es porque encontro la palabra y entonces le doy espacio suficiente a mi vector_Data y asigno los datos como elemento de mi vector_Data*/
            {
                cant_encontradas++;
                vector_Data = realloc(vector_Data, cant_encontradas * sizeof(Posicion));
                vector_Data[cant_encontradas-1] = Data;
            }
        }
    }
}
vector_Data[cant_encontradas].palabra = NULL;
return vector_Data;

}

marcelogarberoglio commented 2 years ago

Más allá de "no funciona", ¿pudiste comprobar si no encuentra ninguna palabra o solo algunas? Por ejemplo, cuando hacés for(int i = pos_i ; i<FILS ; i++) / pos_i seria la fila de mi sopa donde empiezo a buscar/

{

    for(int j = pos_j; j<COLS; j++)/* pos_j seria la columna de mi sopa donde empiezo a buscar*/

¿no deberíaas usar inc_i y/o inc_j?

romamati commented 2 years ago

Tengo entendido que no porque i representa a la fila y j representa a la columna de mi sopa y luego de eso asigno sus valores en aux_i y en aux_j para poder hacer sobre estos los incrementos y decrementos correspondientes segun la direccion en la que me muevo. (Esto ultimo sucede en el ultimo for donde pongo aux_i+=Inc_i, aux_j+=Inc_j).

Siendo mas claro con el problema lo que sucede cuando intento correr el programa es que el -fsanitize me indica que hubo un error de overflow y me dice que parte de mi funcion "resolverSopa" en la linea donde pongo :

vector_Data = realloc(vector_Data, cant_encontradas * sizeof(Posicion));

y tambien en la linea donde pongo: vector_Data[cant_encontradas].palabra = NULL;

Pero honestamente no encuentro mi error en estas lineas y es por eso que lo queria consultar.