Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
HoonteR

C++ terminate called after throwing an instance of std bad_alloc

Recommended Posts

Boa tarde, estou aprendendo agora sobre programação orientada a objeto e a professora passou um exercicio para criar uma matriz de adjacência que represente um grafo, usando classe, destrutor, contrutor método para criar uma aresta entre 2 vértices, método para excluir uma aresta entre 2 vértices, método para mostrar a matriz de adjacência, até ai tudo bem, consegui criar a matriz tranquilamente( acho eu) até certa parte do codigo ela funciona perfeitamente, 

#include "grafo.h"
#include <iostream>
using namespace std;
grafo::grafo(int x)
{
    this ->tam = x;                                 // Tamnho definido pelo usuario
    for (int i=0; i < x;i++){
        for(int j=0; j < x; j++){
            mat[i * j] = 0;                             // inicializando a matriz com tudo zerado.
        }
    }
}
void grafo::getGrafo (){
    for (int i=0; i < tam;i++)
    {
        for(int j=0; j < tam; j++)
        {
            cout << mat[i * j] ;                    // Imprimindo a matriz.
        }
        cout<< endl;
    }
}
grafo::~grafo()
{

    //dtor
}

até aqui o codigo funciona de boa, o erro acontece quando tento criar um setGrafo, assim:

#include "grafo.h"
#include <iostream>
using namespace std;
grafo::grafo(int x)
{
    this ->tam = x;                                 // Tamnho definido pelo usuario
    for (int i=0; i < x;i++){
        for(int j=0; j < x; j++){
            mat[i * j] = 0;                             // inicializando a matriz com tudo zerado.
        }
    }
}
void grafo::setGrafo(int a, int b){
mat [ a* b] = 1;
mat [b *a] =1 ;
}
void grafo::getGrafo (){
    for (int i=0; i < tam;i++)
    {
        for(int j=0; j < tam; j++)
        {
            cout << mat[i * j] ;                    // Imprimindo a matriz.
        }
        cout<< endl;
    }
}
grafo::~grafo()
{

    //dtor
}

 quando insiro o setGrafo ele começa a dar erro de "terminate called after throwing an instance of std bad_alloc"..

o Main e o grafo.h ..

#ifndef GRAFO_H
#define GRAFO_H



class grafo
{
    private:
        int tam;                                    // tamanho da matriz
        int *mat = new int[tam * tam];              //Matriz para o grafo.
    public:
        grafo(int x);
        void getGrafo();
        virtual ~grafo();
        void setGrafo(int a, int b);
};

#endif // GRAFO_H
#include <iostream>
#include <grafo.h>
using namespace std;

int main()
{
    int x;
    cin >> (x);
    grafo teste(x);
    teste.getGrafo();
    return 0;
}

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que seja um erro de alocação de memória, se você inicializar uma matriz com 5 endereços, e tentar acessar o 6 vai dar um erro, por exemplo:

grafo teste(5); 

teste.setGrafo(6,5); // superior a 25 - erro

 

Porém testei seu código, e não vi nenhum erro, dei até uma testada em apenas um arquivo, segue:

#include <iostream>
using namespace std;

class grafo
{
    private:
        int tam;                                    // tamanho da matriz
        int *mat = new int[tam*tam];             //Matriz para o grafo.
    public:
        grafo(int x);
        void getGrafo();
        void setGrafo(int, int);
};

grafo::grafo(int x) : tam(x)
{
    for (int i=0; i < x;i++){
        for(int j=0; j < x; j++){
            mat[i * j] = 0;                             // inicializando a matriz com tudo zerado.
        }
    }
}

void grafo::getGrafo (){
    for (int i=0; i < tam;i++){
        for(int j=0; j < tam; j++){
            cout << mat[i * j] ;                    // Imprimindo a matriz.
        }
        cout<< endl;
    }
}

void grafo::setGrafo(int x, int y){
        mat [x*y] = 1;// inverter os valores não faz diferença
}

int main(){
        grafo teste(5);
        teste.getGrafo();
  	cout << endl;
        teste.setGrafo(6,5);
        teste.getGrafo();
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@TYSQUARE89 entendo, a solução que acabei encontrando foi em um video no youtube que falava sobre o 'malloc', usando isso no código não tive mais nenhum problema com memoria, porém agora minha dificuldade é criar uma funçao que encontre um caminho e mostre ele na tela entre 2 vértices ( dadas pelo usuário), EX: vertices [1..3]as arestas são  1-3, 2-3 ai o usuario quer saber o caminho de 1 até 2, eu teria que imprimir na tela ( 1 -> 3 -> chega em 2)... to com problema de logica para resolver essa parte tentei varias coisas q não consegui teria como ajudar nisso??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu poderia ajudar, mas como parte das regras do fórum é necessário que você mostre seu código, o erro e qual o problema.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@TYSQUARE89 O codigo que eu montei foi esse,

void grafo::caminho(int s, int d){
int caminho[tam],i,j=0;
bool verf[tam];
for (i=0;i<tam;i++){
    verf[i]=false;
}
i=0;
caminho[j]=s;
s=s-1; // destino é ele menos 1, porque a matriz começa em 0.
while(i < tam){
        if (mat[i][s] == 1){
            if(verf[i] == false){ //verfica se esse lugar ja foi acessado ou não.
                s=i;
                j++;
                caminho[j]=s+1;  //adiciona ao caminho esse novo endereço que vai ser acessado.
                i=0;
            }
        }
        i++;
        if(caminho[j]== d){ // verfica se ja chegamos ao destino.
            i=j;
            cout<<"destino "<<caminho[j]<<endl;
            for (j=0;j<=i;j++){
                cout<<" - " << caminho[j];     //imprime
            }
            cout<<endl;
            i=tam+1;
        }
        if (i == tam){                      // Caso essa vertice não tenha mais nenhuma aresta, ele volta a antecessora
                caminho[j]=0;
                j--;
                verf[s]=true;
                s = caminho[j]-1;
                while (caminho[j] == true){
                    j--;
                    if (j<0){           //Se tentar acessar algo antes do destino quer dizer que nao existe caminho.
                        i = tam+1;
                        cout << "Caminho nao existe."<<endl;
                    }
                }
                i=0;
        }
}
}

ele funciona se o caminho tiver 3 acessos apenas, exemplo: existe aresta entre a vertice 1-2 , 2-3, se eu pedir um caminho entre 1 e 3 ele vai imprimir      1-2-3, porém se tiver algo assim, 1-2, 2-3, 3-4 e eu pedir o caminho entre 1-4 ele entra em loop :V

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×