Error de compilación en bloque de bits

Iniciado por loryisus, 8 Marzo 2014, 17:48 PM

0 Miembros y 1 Visitante están viendo este tema.

loryisus

Buenas, resulta que una vez he acabado este código sobre bloques de bits, me encuentro con el siguiente error de compilación (o parecido) en todas las lineas en las que se menciona "get_block_t":

error: pasar 'const bit_set' como el argumento 'this' de 'block_t bit_set::get_block_t()' descarta a los calificadores [-fpermissive]

El código entero de errores sería este de a continuación:

bit_set_2.cpp: En la función miembro 'void bit_set::set_union(const bit_set&)':
bit_set_2.cpp:35:37: error: pasar 'const bit_set' como el argumento 'this' de 'block_t bit_set::get_block_t()' descarta a los calificadores [-fpermissive]
bit_set_2.cpp: En la función miembro 'void bit_set::set_union(const bit_set&, bit_set&)':
bit_set_2.cpp:39:45: error: pasar 'const bit_set' como el argumento 'this' de 'block_t bit_set::get_block_t()' descarta a los calificadores [-fpermissive]
bit_set_2.cpp: En la función miembro 'void bit_set::set_intersection(const bit_set&)':
bit_set_2.cpp:43:37: error: pasar 'const bit_set' como el argumento 'this' de 'block_t bit_set::get_block_t()' descarta a los calificadores [-fpermissive]
bit_set_2.cpp: En la función miembro 'void bit_set::set_intersection(const bit_set&, bit_set&)':
bit_set_2.cpp:47:45: error: pasar 'const bit_set' como el argumento 'this' de 'block_t bit_set::get_block_t()' descarta a los calificadores [-fpermissive]
bit_set_2.cpp: En la función miembro 'void bit_set::set_diff(const bit_set&)':
bit_set_2.cpp:57:39: error: pasar 'const bit_set' como el argumento 'this' de 'block_t bit_set::get_block_t()' descarta a los calificadores [-fpermissive]
bit_set_2.cpp: En la función miembro 'void bit_set::set_diff(const bit_set&, bit_set&)':
bit_set_2.cpp:61:47: error: pasar 'const bit_set' como el argumento 'this' de 'block_t bit_set::get_block_t()' descarta a los calificadores [-fpermissive]
bit_set_2.cpp: En la función miembro 'bool bit_set::contains(const bit_set&)':
bit_set_2.cpp:75:22: error: pasar 'const bit_set' como el argumento 'this' de 'block_t bit_set::get_block_t()' descarta a los calificadores [-fpermissive]
bit_set_2.cpp:75:51: error: pasar 'const bit_set' como el argumento 'this' de 'block_t bit_set::get_block_t()' descarta a los calificadores [-fpermissive]
bit_set_2.cpp:77:2: error: expected '}' before 'else'

Aquí están las funciones detalladas:

bit_set::bit_set(void):
block_size_(32), /*int = 32 bits*/
block_(0)
{
}

bit_set:: ~bit_set(void){
}

block_t bit_set::get_block_t() {
return block_;

}

void bit_set::set_block_t(block_t b){
block_ = b;
}


void bit_set::set_union(item_t i){
    block_t nuevo = ONE_MASK;
nuevo = nuevo << i;
block_ = block_ | nuevo;
    }
   
void bit_set::set_union(const bit_set& bs){
   block_ = block_ | bs.get_block_t();
}

void bit_set::set_union(const bit_set& i_bs, bit_set& o_bs){
o_bs.set_block_t(block_ | i_bs.get_block_t());
}

void bit_set::set_intersection(const bit_set& bs){
   block_ = block_ & bs.get_block_t();
}

void bit_set::set_intersection(const bit_set& i_bs, bit_set& o_bs){
o_bs.set_block_t(block_ & i_bs.get_block_t());
}

void bit_set::set_diff(item_t i){
    block_t nuevo = ONE_MASK;
nuevo = nuevo << i;
block_ = block_ & (~nuevo);
}

void bit_set::set_diff(const bit_set& bs){
   block_ = block_ & (~bs.get_block_t());
}

void bit_set::set_diff(const bit_set& i_bs, bit_set& o_bs){
o_bs.set_block_t(block_ & (~i_bs.get_block_t()));
}

bool bit_set::belongs(item_t i){
   block_t nuevo = ONE_MASK;
   nuevo = nuevo << i; /*desplazamiento a la izquierda*/
   if ((nuevo & block_)==EMPTY_SET_MASK){ /*comparación con el bloque creado*/
   return false;   
   }else{
  return true;   
   }
}

bool bit_set::contains(const bit_set& a){
    if(a.get_block_t() == (block_ & a.get_block_t())){
return true;
else{
return false;
}
}

void bit_set::write(ostream& os){
char aux[80];

itoa(aux); /*Transforma el bloque en la cadena aux*/
os << aux << std::endl;
}


Y aquí el fichero donde declaré todas las variables de la clase:

#include <iostream>

using namespace std;

typedef unsigned long block_t;
typedef unsigned char item_t;
typedef unsigned char block_size_t;

#define EMPTY_SET_MASK 0x00    // Máscara hexadecimal que representa el 0
#define ONE_MASK       0x01    // Máscara hexadecimal que representa el bit más significativo a 1



    class bit_set {

//========================================================================================
// Atributos privados.
//========================================================================================
private:
block_t block_;
block_size_t block_size_;


Si tienen alguna idea de que podría ser el problema y como podría solucionarlo díganmelo.

Gracias por adelantado

eferion


block_t bit_set::get_block_t() {
return block_;

}

void bit_set::set_union(const bit_set& bs){
   block_ = block_ | bs.get_block_t();
}


Si get_block_t no es const no puede ser llamada desde una instancia declarada como const.

En set_union se está haciendo bs.get_block_t y bs está definida como const.

o le añades const a get_block_t o le quitas el const al parámetro bs.

loryisus

Cita de: eferion en  8 Marzo 2014, 23:05 PM

block_t bit_set::get_block_t() {
return block_;

}

void bit_set::set_union(const bit_set& bs){
   block_ = block_ | bs.get_block_t();
}


Si get_block_t no es const no puede ser llamada desde una instancia declarada como const.

En set_union se está haciendo bs.get_block_t y bs está definida como const.

o le añades const a get_block_t o le quitas el const al parámetro bs.


¿Y como se le añadiría el const?  :o . Es que es imprescindible que se mantenga en las funciones y no tengo ni idea de como podría hacerlo.

eferion

Deberías comprarte un manual de C++... si ya lo tienes, deberías leerlo.

Código (cpp) [Seleccionar]
block_t bit_set::get_block_t( ) const {

y lo mismo en la declaración.

loryisus

Cita de: eferion en  9 Marzo 2014, 01:41 AM
Deberías comprarte un manual de C++... si ya lo tienes, deberías leerlo.

Código (cpp) [Seleccionar]
block_t bit_set::get_block_t( ) const {

y lo mismo en la declaración.


Okis ya va bien gracias por tu tiempo... e intentaré pillarme un manual de C++ para la próxima vez  :-(