iagoac / mc202

Disciplina MC202 - Estruturas de Dados
GNU General Public License v3.0
17 stars 13 forks source link

Problema Lab2 #36

Closed leticia-rosa closed 3 years ago

leticia-rosa commented 4 years ago

Olá, Meu código apresenta dois problemas que não sei como solucionar.

  1. O primeiro é o problema de memória que ocorre para os últimos casos do Susy, que acredito estar sendo causado pela minha alocação de memória, pois antes este problema de pilha aparecia para todos os testes do Susy, e após algumas mudanças aparece apenas para os casos mais longos. Estou fazendo a alocação de uma matriz, na qual guardo os dados de número de casos e idade, inicialmente para um tamanho de 5 linhas, e então, quando necessário aloco o dobro de memória e conforme o número de linhas da minha matriz aumente vai alocando sempre o dobro. Ficou dessa forma: Alocação inicial:
    for (k=0;k<5; k++)
        armazena[k] = malloc(2* sizeof(int));

Alocação extra:

                if( cont_linha +1 > cont) {  
        cont = 2*cont;  
        armazena = malloc(cont*sizeof(int *));    /*aloca o dobro de memoria caso precise*/
        for (m=0; m<cont; m++)
            armazena[m] = malloc(2* sizeof(int));
                    }

em que cont_linha é o contador de número de linhas da minha matriz iniciado em 0 e cont inicia em 5. O erro que apresenta nos 3 últimos testes do Susy é: Tamanho máximo da pilha ou da memória dinâmica excedido, ou talvez apontador inválido (código 139).

  1. O segundo é referente aos valores incorretos de saída. Alguns são corretos porém outros são nulos e outros errados. O que estou fazendo é varrer a matriz de casos e idade e guardar em uma variável o número de casos no range de idade da função consulta e imprimir esse valor e zerá-lo para a nova interação. Porém coloquei para imprimir a matriz armazenada a cada interação e descobri que ela preenche corretamente as linhas da função adicionar porém coloca zeros nas linhas correspondentes a função consultar, e não sei o porque, já que atribuo o valor na matriz apenas para a função adicionar, desta forma, dentro do laço principal:

    if(operacao==0){ / Operacao Adiciona/

        for(l=0;l<cont_linha;l++){                             /* confere se a idade é repetida */
            if(y==armazena[l][1])
                armazena[l][0]=armazena[l][0] + x;
        }       
        armazena[i][0] = x; /*casos de corona */
        armazena[i][1] = y; /* idade */
    
    }
    
    else if (operacao==1){    /* Operacao Consulta */
        /*printf("entrou\n");*/
        x_c = x;  /* inicio do intervalo de idade */
        y_c = y;  /* fim do intervalo de idade  x<y */
    
        for(j=0;j<cont_linha;j++){
            if( armazena[j][1] >= x_c && armazena[j][1] <= y_c ) {
                /*printf("%d\n", soma);*/
                soma = soma + armazena[j][0];   
            }
        }  
    
        printf("%d\n", soma);
        soma = 0;
    
    }

Não estou vendo o que está de errado. Qualquer ajuda será bem vinda.

ghost commented 4 years ago

Olá, Meu código apresenta dois problemas que não sei como solucionar.

  1. O primeiro é o problema de memória que ocorre para os últimos casos do Susy, que acredito estar sendo causado pela minha alocação de memória, pois antes este problema de pilha aparecia para todos os testes do Susy, e após algumas mudanças aparece apenas para os casos mais longos. Estou fazendo a alocação de uma matriz, na qual guardo os dados de número de casos e idade, inicialmente para um tamanho de 5 linhas, e então, quando necessário aloco o dobro de memória e conforme o número de linhas da minha matriz aumente vai alocando sempre o dobro. Ficou dessa forma: Alocação inicial:
  for (k=0;k<5; k++)
      armazena[k] = malloc(2* sizeof(int));

Alocação extra:


          cont = 2*cont;  
          armazena = malloc(cont*sizeof(int *));    /*aloca o dobro de memoria caso precise*/
          for (m=0; m<cont; m++)
              armazena[m] = malloc(2* sizeof(int));
                        }
}```
          `
em que cont_linha é o contador de número de linhas da minha matriz iniciado em 0 e cont inicia em 5.
O erro que apresenta nos 3 últimos testes do Susy é: **Tamanho máximo da pilha ou da memória dinâmica excedido, ou talvez apontador inválido (código 139).**

2. O segundo é referente aos valores incorretos de saída. Alguns são corretos porém outros são nulos e outros errados. O que estou fazendo é varrer a matriz de casos e idade e guardar em uma variável o número de casos no range de idade da função consulta e imprimir esse valor e zerá-lo para a nova interação. Porém coloquei para imprimir a matriz armazenada a cada interação e descobri que ela preenche corretamente as linhas da função adicionar porém coloca zeros nas linhas correspondentes a função consultar, e não sei o porque, já que atribuo o valor na matriz apenas para a função adicionar, desta forma, dentro do laço principal:

```if(operacao==0){          /* Operacao Adiciona*/

          for(l=0;l<cont_linha;l++){                             /* confere se a idade é repetida */
              if(y==armazena[l][1])
                  armazena[l][0]=armazena[l][0] + x;
          }       
          armazena[i][0] = x; /*casos de corona */
          armazena[i][1] = y; /* idade */

      }

      else if (operacao==1){    /* Operacao Consulta */
          /*printf("entrou\n");*/
          x_c = x;  /* inicio do intervalo de idade */
          y_c = y;  /* fim do intervalo de idade  x<y */

          for(j=0;j<cont_linha;j++){
              if( armazena[j][1] >= x_c && armazena[j][1] <= y_c ) {
                  /*printf("%d\n", soma);*/
                  soma = soma + armazena[j][0];   
              }
          }  

          printf("%d\n", soma);
          soma = 0;

      }```

Não estou vendo o que está de errado. Qualquer ajuda será bem vinda.

Letícia, não sou pad mas já entreguei meu lab, então tenho consciência limpa e posso tentar te ajudar. Meu e-mail é barbosa.carlos.ec@gmail.com caso queira mandar o seu código para eu dar uma olhada

iagoac commented 4 years ago

@leticia-rosa acredito que você poderia fazer algo mais simples. Você está utilizando uma estrutura bi-dimensional (a variável armazena poder ser um vetor e não uma matriz).

Até onde eu vi, a realocação de memória também está errada. Você está fazendo um malloc em uma variável que já está alocada (ou pelo menos é o que deu a impressão por este seu pedaço de código). O correto seria utilizar a função realloc.

Dê uma conferida na sua função de realocação de memória que eu acredito que o erro esteja por lá.