PI-ITBA / 2024_01

9 stars 0 forks source link

TP11_EJ17 #287

Closed dalilaorbaj closed 1 month ago

dalilaorbaj commented 1 month ago

Hola! Queria consultar por el ej 17, ya que me esta dando segmentation fault y no logro encontrar el error. Desde ya muchas gracias!

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include "17.h"
//opto por arreglo de arreglos, cual matriz, para hacer lo mas eficiente posible la funcion squirrelsInBlock, que seria acceder mediante indice 
// si tengo un vector que se que no voy a ocupar todas las posiciones, como hago con el manejo de memoria? 

struct fila{
    size_t * columnas;
    size_t cantCols;
};

typedef struct fila * Fila;

typedef struct squirrelCensusCDT{
    Fila filas;
    size_t cantFilas;  
    size_t N;
}squirrelCensusCDT;

squirrelCensusADT newSquirrelCensus(size_t blockSizeMetres){
    if(blockSizeMetres == 0){
        exit(1);
    }
    squirrelCensusADT new = calloc(1, sizeof(squirrelCensusCDT));
    new->N = blockSizeMetres;
    return new;
}

size_t countSquirrel(squirrelCensusADT squirrel, size_t yDistance, size_t xDistance){
    size_t iy = xDistance/squirrel->N;
    size_t ix = yDistance/squirrel->N;

    if(squirrel->cantFilas <= ix){
        squirrel->filas = realloc(squirrel->filas, (ix+1) * sizeof(struct fila));
        for(size_t i=squirrel->cantFilas ; i<=ix ; i++){
            squirrel->filas[i].columnas = NULL;
            squirrel->filas[i].cantCols = 0; //tengo que inicializar todo en cero para no tener basura
        }
        squirrel->cantFilas = ix +1;        
    }

    if(squirrel->filas[ix].cantCols <= iy){
        squirrel->filas[ix].columnas = realloc(squirrel->filas[ix].columnas, (iy+1)*sizeof(size_t));
        for(size_t i = squirrel->filas[ix].cantCols ; i<=iy ; i++){
            squirrel->filas[ix].columnas[i] = 0;
        }
        squirrel->filas[ix].cantCols = iy+1;
    }
    squirrel->filas[ix].columnas[iy] += 1;
    return squirrel->filas[ix].columnas[iy];
}

size_t squirrelsInBlock(const squirrelCensusADT squirrel, size_t yDistance, size_t xDistance){
    size_t iy = xDistance/squirrel->N;
    size_t ix = yDistance/squirrel->N;

    if(squirrel->cantFilas <= ix || squirrel->filas[ix].cantCols <= iy){
        return 0;
    } 
    return squirrel->filas[ix].columnas[iy];
}

void freeSquirrelCensus(squirrelCensusADT squirrel){
    for(int i=0 ; i < squirrel->cantFilas ; i++){
        free(squirrel->filas[i].columnas);
        //free(squirrel->filas[i]); (?) por que esto esta de mas?
    }
    free(squirrel->filas);
    free(squirrel);
}

El flag sanitize me tira el siguiente error:

image
dalilaorbaj commented 1 month ago

No dije nada, ya lo encontre!