Ir ao conteúdo
  • Cadastre-se

C Alguém sabe me dizer o por que do meu código estar quebrando na linha 26?


BRNMR

Posts recomendados

Estou desenvolvendo um trabalho de mochila binaria, o trabalho consiste em preencher a mochila aleatoriamente com 0 e 1, 12500 vezes até que encontremos uma solução viável(cujo peso não extrapole o limite da mochila), mas meu código esta quebrando na linha 26, no online GDB não mostra, mas joguei no python tutor e lá ele acusa o código quebrando na linha 26 e dando uma mensagem de "Invalid write of size 4" que impede de continuar, se alguém puder me ajudar agradeceria muito.

 

Segue o link do código : https://onlinegdb.com/ggUwu-Xbx

  • Obrigado 1
  • Confuso 1
Link para o comentário
Compartilhar em outros sites

Eu tinha colocado o link do código, que leva ao online gdb onde é mais fácil de visualizar o código, mas posso por o código aqui manualmente caso julguem mais fácil.

 

Segue o código:

 

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

int Aleatorio(int n, int qt, int *maior,int *capacidade,int *somaPeso, int *somaBeneficio,int *solucao[],int *melhorSolucao[], int peso[], int beneficio[] ){
    
    
    srand( (unsigned)time(NULL));
    *somaBeneficio = 0;
    *somaPeso = 0;
    
    
    // Condição de parada //
    
    if(qt == 10){
        return 0;
    }
    // Preenche mochila com valores aleatorios entre 0 e 1 //
    
    for(int i = 0; i<n;i++){
        *solucao[i] = rand() % 2;
        if (*solucao[i] == 1){
            *somaBeneficio = *somaBeneficio + beneficio[i];
            *somaPeso = *somaPeso + peso[i];
        }
    }
    
    // Verifica se essa solução é viavel //
    
    if(*somaBeneficio > *maior && *somaPeso <= *capacidade){
        *maior = *somaBeneficio;
        for(int b = 0; b<n;b++){
            *melhorSolucao[b] = *solucao[b];
        }
        
   
    }    
    
    Aleatorio(n,++qt,maior,capacidade,somaPeso,somaBeneficio,solucao,melhorSolucao,peso,beneficio);
    
        
}
    
//-------------------------------------------------------------------------------------------------------------//
int main()
{
   int somaPeso = 0;
    int somaBeneficio = 0;
    int maior = 0;
    int capacidade = 15;
    // int peso[15] = {4,5,2,7,9,4,5,3,5,8,1,3,5,5,7};
    // int beneficio[15] = {3,6,1,3,8,3,6,4,2,4,7,5,4,6,7};
    int peso[5] = {12,1,4,1,2};
    int beneficio[5] = {4,2,10,1,2};
    int *solucao = (int*) malloc(sizeof(int)*5);
    int *melhorSolucao = (int*) malloc(sizeof(int)*5);
    
    
    Aleatorio(5,0, &maior,&capacidade, &somaPeso, &somaBeneficio, &solucao, &melhorSolucao,peso,beneficio );
    printf("beneficio: %d  ",maior);
    printf("Melhor Solução [%d, %d, %d, %d, %d]",melhorSolucao[0],melhorSolucao[1],melhorSolucao[2],
    melhorSolucao[3],melhorSolucao[4]);

    return 0;
}


A  linha que esta dando problema é essa linha:

*somaBeneficio = *somaBeneficio + beneficio[i];

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@BRNMR    não precisa ser ponteiro para que receba valores em uma função e possa usar em outra ,  pode ser um vetor simples , e na Hora de enviar para a função ,  indique a posição zero do vetor , que é onde começa o endereço do vetor na memória ,  e seu código ficaria se assim  :

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

int Aleatorio(int n, int qt, int* maior, int* capacidade, 
    int* somaPeso, int* somaBeneficio, int* solucao/*[]*/, 
    int* melhorSolucao[], int peso[], int beneficio[]) 
{
    srand(/*(unsigned)*/ time(NULL));
    *somaBeneficio = 0;
    *somaPeso = 0;


    // Condição de parada //

    if (qt == 10) {
        return 0;
    }
    // Preenche mochila com valores aleatorios entre 0 e 1 //

    for (int i = 0; i < n; i++) 
    {
        solucao[i] = rand() % 2;
        printf("aqui  %d\n",solucao[i]);
        if (/***/solucao[i] == 1) 
        {
            *somaBeneficio = *somaBeneficio + beneficio[i];
            *somaPeso = *somaPeso + peso[i];
            printf("somaBeneficio = %d\n", *somaBeneficio);
            printf("somaPeso = %d\n", *somaPeso);
        }
    }
    //return 0;
    // Verifica se essa solução é viavel //

    if (*somaBeneficio > *maior && *somaPeso <= *capacidade) {
        *maior = *somaBeneficio;
        printf("aqui  %d\n", *somaBeneficio);
        for (int b = 0; b < n; b++) {
            *melhorSolucao[b] = /***/solucao[b];
        }


    }

    //Aleatorio(n, ++qt, maior, capacidade, somaPeso, somaBeneficio, solucao, melhorSolucao, peso, beneficio);


}

//-------------------------------------------------------------------------------------------------------------//
int main()
{
    int somaPeso = 0;
    int somaBeneficio = 0;
    int maior = 0;
    int capacidade = 15;
    // int peso[15] = {4,5,2,7,9,4,5,3,5,8,1,3,5,5,7};
    // int beneficio[15] = {3,6,1,3,8,3,6,4,2,4,7,5,4,6,7};
    int peso[5] = { 12,1,4,1,2 };
    int beneficio[5] = { 4,2,10,1,2 };
    //int* solucao = (int*)malloc(sizeof(int) * 5);
    int solucao[5] = {0};// = (int*)malloc(sizeof(int) * 5);
    int* melhorSolucao = (int*)malloc(sizeof(int) * 5);


    Aleatorio(5, 0, &maior, &capacidade, &somaPeso, 
              &somaBeneficio, &solucao[0], 
              &melhorSolucao, peso, beneficio);
    printf("\n");
    printf("beneficio ------: %d\n", maior);
    printf("Melhor Solução -: [%d, %d, %d, %d, %d]\n\n\n", 
        melhorSolucao[0], melhorSolucao[1], melhorSolucao[2],
        melhorSolucao[3], melhorSolucao[4]);

    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

23 horas atrás, BRNMR disse:

Eu tinha colocado o link do código, que leva ao online gdb onde é mais fácil de visualizar o código

 

Acessando o forum sequer dá para visualizar tal código. Apenas uma linha com um link, que leva a uma suposta sessão online de um navegador.

 

Não falo pelo forum, mas imagino que o que se espera num forum assim é que a questão tenha um título significativo e o código visível, de modo a ser possível visualizar tal código aqui e que outros que tenham dúvida similar possam se beneficiar. 

 

E alguém que ache que possa ajudar possa de imediato copiar o código para seu ambiente e testar.

 

Use o tal botão code como explicado no primeiro tópico do forum. Eis o seu programa:

 

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

int Aleatorio(
    int n, int qt, int* maior, int* capacidade,
    int* somaPeso, int* somaBeneficio, int* solucao[],
    int* melhorSolucao[], int peso[], int beneficio[])
{
    srand((unsigned)time(NULL));
    *somaBeneficio = 0;
    *somaPeso      = 0;

    // Condição de parada //

    if (qt == 10) { return 0; }
    // Preenche mochila com valores aleatorios entre 0 e 1
    // //

    for (int i = 0; i < n; i++)
    {
        *solucao[i] = rand() % 2;
        if (*solucao[i] == 1)
        {
            *somaBeneficio = *somaBeneficio + beneficio[i];
            *somaPeso      = *somaPeso + peso[i];
        }
    }

    // Verifica se essa solução é viavel //

    if (*somaBeneficio > *maior && *somaPeso <= *capacidade)
    {
        *maior = *somaBeneficio;
        for (int b = 0; b < n; b++)
        {
            *melhorSolucao[b] = *solucao[b];
        }
    }

    Aleatorio(
        n, ++qt, maior, capacidade, somaPeso, somaBeneficio,
        solucao, melhorSolucao, peso, beneficio);
}

//-------------------------------------------------------------------------------------------------------------//
int main()
{
    int somaPeso      = 0;
    int somaBeneficio = 0;
    int maior         = 0;
    int capacidade    = 15;
    // int peso[15] = {4,5,2,7,9,4,5,3,5,8,1,3,5,5,7};
    // int beneficio[15] = {3,6,1,3,8,3,6,4,2,4,7,5,4,6,7};
    int  peso[5]       = {12, 1, 4, 1, 2};
    int  beneficio[5]  = {4, 2, 10, 1, 2};
    int* solucao       = (int*)malloc(sizeof(int) * 5);
    int* melhorSolucao = (int*)malloc(sizeof(int) * 5);

    Aleatorio(
        5, 0, &maior, &capacidade, &somaPeso,
        &somaBeneficio, &solucao, &melhorSolucao, peso,
        beneficio);
    printf("beneficio: %d  ", maior);
    printf(
        "Melhor Solução [%d, %d, %d, %d, %d]",
        melhorSolucao[0], melhorSolucao[1],
        melhorSolucao[2], melhorSolucao[3],
        melhorSolucao[4]);

    return 0;
}

 

Sobre o código e o enunciado

 

Em 21/03/2022 às 07:20, BRNMR disse:

um trabalho de mochila binaria, o trabalho consiste em preencher a mochila aleatoriamente com 0 e 1, 12500 vezes até que encontremos uma solução viável(cujo peso não extrapole o limite da mochila)

 

Não consegui associar o código com esse enunciado. O que é uma "mochila binária"? Onde entram os 12500? O que é beneficio[]? Pode postar o exemplo? Parece um exercício clássico de permutações.

 

Sobre Aleatório()

 

Uma função com nada menos que 10 parâmetros e recursiva é algo problemático.

 

  • está certo de que ela deve ser recursiva?
  • precisa mesmo de 10 parâmetros se o retorno é uma combinação de pesos?
  • se vai retornar uma combinação de pesos que atenda um critério não seria mais simples retornar simplesmente o endereço de um novo vetor com alguma permutação encontrada e que satisfaça o critério? Ou NULL se não achar uma combinação em certo tempo ou certo número de tentativas? É muito mais comum.
  • Se o máximo de pesos é pequeno não pode retornar apenas um int usando os bits, que já são 0 ou 1, como a combinação de pesos? um int pode representar 32 pesos, um long 64 pesos, um vetor de 10 long pode representar 640 pesos para uma mochila.
  • considere usar uma estrutura com a tal Mochila

 

 

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...