Acho que pode ser um bug do compilador... ou meu mesmo

1. Acho que pode ser um bug do compilador... ou meu mesmo

Zé Ninguém
Sugaryume

(usa Debian)

Enviado em 11/05/2018 - 10:52h

Em baixo é o código de uma lista encadeada que estou criando, só que quando eu uso a variável "Tamanho" pra testar a expressão o loop para na metade(quase) e quando uso o valor que esta na variável (13) o loop funciona certinho.

#include <iostream>

using namespace std;

class No{

private:
int Valor;
No* Proximo = nullptr;
No* Anterior = nullptr;

public:
void setValor(int a){

Valor = a;

}

int getValor(){

return Valor;

}

void setProximo(No* a){

Proximo = a;

}

No* getProximo(){

return Proximo;

}

void setAnterior(No* a){

Anterior = a;

}

No* getAnterior(){

return Anterior;

}


};

class Lista{

private:
No* noInicio;
No* noFim;
No* Anterior = nullptr;
int Tamanho = 0;

public:
Lista(){

noInicio = nullptr;
noFim = nullptr;


}

Lista(int a){

No* no = new No;
no->setValor(a);
noInicio = no;
noFim = no;
Tamanho++;

}

bool Vazia(){

if (noInicio == nullptr) return true;
else return false;

}

void AddNoFim(int a){


if (Vazia()){

No* no = new No;
no->setValor(a);
noInicio = no;
noFim = no;
Tamanho++;

}
else {

No* no = new No;
no->setValor(a);
noFim->setProximo(no);
no->setAnterior(noFim);
noFim = no;
Tamanho++;

}

}

void AddNoInicio(int a){

if (Vazia()){

No* no = new No;
no->setValor(a);
noInicio = no;
noFim = no;
Tamanho++;

}
else {

No* no = new No;
no->setValor(a);
no->setProximo(noInicio);
noInicio->setAnterior(no);
noInicio = no;
Tamanho++;

}

}

int getUltimoElemento(){

if (Vazia()){

throw "Lista Vazia!!!";

} else return noFim->getValor();

}

int getPrimeiroElemento(){

if (Vazia()){

throw "Lista Vazia!!!";

} else return noInicio->getValor();

}

void Mostrar(){

if (!Vazia()){

No* no;
no = noInicio;

while (no->getProximo() != nullptr){

cout << "Valor: " << no->getValor() << endl;
no = no->getProximo();

}

cout << "Valor: " << no->getValor() << endl; /// imprime o ultimo elemento
}

}

void RemoverDoFim(){

No* Aux;

if (!Vazia()){

if (noFim->getAnterior() != nullptr){

Aux = noFim->getAnterior();
Aux->setProximo(nullptr);
delete noFim;
noFim = Aux;
Tamanho--;

}
else {

delete noFim;
noFim = nullptr;
noInicio = nullptr;
Tamanho--;

}

}

}

void RemoverDoInicio(){

No* Aux;

if (!Vazia()){

if (noInicio->getProximo() != nullptr){

Aux = noInicio->getProximo();
Aux->setAnterior(nullptr);
delete noInicio;
noInicio = Aux;
Tamanho--;

}
else {

delete noInicio;
noInicio = nullptr;
noFim = nullptr;
Tamanho--;

}

}

}

unsigned int PegaTamanho(){

return Tamanho;

}

void LimpaTodaALista(){

for (int i = 0; i < Tamanho; i++){ /// AQUI ESTA O MEU PROBLEMA

RemoverDoInicio();
cout << "LOOP: " << i << " Tamanho: " << Tamanho << endl;

}

}

};


int main(){

Lista LISTA;

try{

///pode (e vai) acontercer um erro aqui (Lista Vazia)
cout << "Ultimo Elemento: " << LISTA.getUltimoElemento() << endl;

}
catch(const char* e){

cout << "ERROR: " << e << endl;

}

for (int i = 0; i < 8; i++) LISTA.AddNoInicio(i);
for (int i = 0; i < 5; i++) LISTA.AddNoFim(i);

try{

///pode acontercer um erro aqui (Lista Vazia) mais não deve...
cout << "\nUltimo Elemento: " << LISTA.getUltimoElemento() << endl;

}
catch(const char* e){

cout << "ERROR: " << e << endl;

}

LISTA.Mostrar();

cout << "Tamanho de Lista: " << LISTA.PegaTamanho() << endl;

cout << "\nDEPOIS DE LIMPAR TODA A LISTA\n";

LISTA.LimpaTodaALista();
LISTA.Mostrar();

cout << "Tamanho de Lista: " << LISTA.PegaTamanho() << endl;
getwchar();


return 0;
}


eu to usando o code::blocks com o minWG. Compilando no terminal o resultado é o mesmo, esse:
thor@thanos:~/Documentos/teste$ g++ main.cpp -o teste
thor@thanos:~/Documentos/teste$ ./teste
ERROR: Lista Vazia!!!

Ultimo Elemento: 4
Valor: 7
Valor: 6
Valor: 5
Valor: 4
Valor: 3
Valor: 2
Valor: 1
Valor: 0
Valor: 0
Valor: 1
Valor: 2
Valor: 3
Valor: 4
Tamanho de Lista: 13

DEPOIS DE LIMPAR TODA A LISTA
LOOP: 0 Tamanho: 12
LOOP: 1 Tamanho: 11
LOOP: 2 Tamanho: 10
LOOP: 3 Tamanho: 9
LOOP: 4 Tamanho: 8
LOOP: 5 Tamanho: 7
LOOP: 6 Tamanho: 6
Valor: 0
Valor: 0
Valor: 1
Valor: 2
Valor: 3
Valor: 4
Tamanho de Lista: 6

thor@thanos:~/Documentos/teste$


eu to usando o debian 9.4


  


2. Re: Acho que pode ser um bug do compilador... ou meu mesmo

Paulo
paulo1205

(usa Ubuntu)

Enviado em 11/05/2018 - 14:36h

Se você sabe onde está o problema (e, sim, o problema está ali, mesmo!), corrija-o.

A questão é: você sabe qual é o problema?

Dica: normalmente, laços de repetição têm apenas um parâmetro de controle (i.e. que varia ao longo das repetições), mas ou seu tem duas coisas variando ao mesmo tempo.


3. Re: Acho que pode ser um bug do compilador... ou meu mesmo

Zé Ninguém
Sugaryume

(usa Debian)

Enviado em 12/05/2018 - 07:40h

É Tamanho vai sendo decrementado em Lista.RemoverDoInicio.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts