TOPIC

Rum time error como resolver, Run time error how

dalves38 asked 3 years ago

#include <stdio.h>
#include <stdlib.h>

typedef struct elemento
{
    int valor, chave;
} Elemento;

typedef struct map
{
    Elemento **dados;
    int *tamanho;
} Map;

Map *cria(int tam);
int insere(Map *mp, int valor, int i);
int libera(Map *mp, int tam);

int main(int argc, char** argv)
{
    int tam, teste;
    int numero, indice;
    int i;
    while(scanf("%d %d", &tam, &teste) != EOF)
    {
        Map *matriz = cria(tam);
        for(i = 0; i < tam; i++)
        {
            scanf("%d", &numero);
            insere(matriz, numero, i + 1);
        }
        for(i = 0; i < teste; i++)
        {
            scanf("%d %d", &indice, &numero);
            if(indice <= matriz->tamanho[numero])
            {
                printf("%d\n", matriz->dados[numero][indice - 1].chave);
            }
            else
            {
                printf("0\n");
            }
        }
        libera(matriz, tam);
    }

    return 0;
}

Map *cria(int tam)
{
    Map *mp = malloc(sizeof(Map));
    if(!mp) return NULL;
    mp->tamanho = calloc(tam, sizeof(int));
    mp->dados = malloc(sizeof(Elemento) * tam);
    int i;
    for(i = 0; i < tam; i++)
    {
        mp->dados[i] =  malloc(sizeof(Elemento) * tam);
    }
    return mp;
}

int insere(Map *mp, int valor, int i)
{
    if(mp->tamanho[valor] == 0)
    {
        int size = mp->tamanho[valor];
        mp->dados[valor][size].valor = valor;
        mp->dados[valor][size].chave = i;
        mp->tamanho[valor]++;
    }
    else
    {
        int size = mp->tamanho[valor];
        mp->dados[valor][size].valor = valor;
        mp->dados[valor][size].chave = i;
        mp->tamanho[valor]++;
    }
    return 1;
}

int libera(Map *mp, int tam)
{
    int i;
    for(i = 0; i < tam; i++)
    {
        free(mp->dados[i]);
    }
    free(mp->tamanho);
    free(mp->dados);
    free(mp);
    return 1;
}

Remember not post solutions. Your post may be reviewed by our moderators.

  • dalves38 replied 3 years ago

    so how do i do it, any ideas

  • feodorv replied 3 years ago

       mp->dados = malloc(sizeof(Elemento) * tam);
        int i;
        for(i = 0; i < tam; i++)
        {
            mp->dados[i] =  malloc(sizeof(Elemento) * tam);
        }

    Here you are trying to allocate memory for n^2+n elements, if n is 10^5 then you are out of memory and many malloc's return NULL.

    You can try my input on udebug.