terça-feira, 23 de outubro de 2007

Correções na classe grafo


Pois é. Haviam alguns erros na classe grafo que postamos. Nenhum deles foi sério (apenas esquemos de colocar a declaração de alguns métodso dentro da classe, e coisas assim). No entanto, o método dimensionar(int tamanho) pode ser problemático dependendo do compilador usado. O problema está no final do post (assim como uma possível solução).


Classe



class Grafo{
private:
int qtdnos;
int **matriz;
int *pesos;
public:
Grafo();
Grafo(int tamanho);
void dimensionar(int tamanho);
void setAresta(int linha, int coluna);
void setAresta(int linha, int coluna, int peso);
void setPeso(int no, int peso);
int getPeso(int no);
int getAresta(int linha, int coluna);
int size();
void showMatriz();
void showPesos();
void showAll();
};



Construtores



Grafo::Grafo(){
dimensionar(0);
}
Grafo::Grafo(int tamanho){
dimensionar(tamanho);
}




dimensionar(int tamanho)



Este método funcionou sem problemas usando o compilador g++. No entanto, quando o compilamos usando o Builder, os ponteiros para inteiro alocados no vetor de pesos e na matriz de adjacência não foram setados para NULL por padrão, o que faz o grafo ser gerado com lixo.
Criamos um workaround para resolver o problema, mas é apresentado dois warnings ao compilar com o g++ (não sei se com o Builder estes warnings aparecem):



grafo.cpp:18: warning: converting to non-pointer type ‘int’ from NULL
grafo.cpp:20: warning: converting to non-pointer type ‘int’ from NULL

linha 18: pesos[i] = NULL;
linha 20: matriz[i][j] = NULL;


Então se alguém pensar em uma solução melhor, por favor, avise :)




void Grafo::dimensionar(int tamanho) {
if (tamanho > 0) {
qtdnos = tamanho;
pesos = new int[qtdnos];
matriz = new int*[qtdnos];
for(int i = 0; i < qtdnos; i++){
matriz[i] = new int[qtdnos];
pesos[i] = NULL;
for(int j = 0; j < qtdnos; j++)
matriz[i][j] = NULL;
}
} else {
qtdnos = 0;
pesos = NULL;
matriz = NULL;
}
}

Nenhum comentário: