Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - xaps

#151
Buenas. Tengo un pequeño problema con una clase Matriz que estoy desarrollando en C++. Según tengo entendido, cuando un parámetro de una función va a ser constante durante toda la ejecución de esa función, se pasa ese parámetro en forma constante y por referencia. Bien, el problema es que en mi clase matriz, me salta un error de compilación en la copiadora-constructora por el uso del tag const en las tres consultoras de la clase (si lo haces desde fuera la clase, los métodos que hacen saltar el error si que funcionan). El error es el siguiente (compilado con g++):

In file included from multiplicacion_matriz.cpp:1:0:
Matriz.cpp: In copy constructor 'Matriz::Matriz(const Matriz&)':
Matriz.cpp:54:37: error: passing 'const Matriz' as 'this' argument of 'const int Matriz::consultar_filas()' discards qualifiers [-fpermissive]
Matriz.cpp:55:43: error: passing 'const Matriz' as 'this' argument of 'const int Matriz::consultar_columnas()' discards qualifiers [-fpermissive]
Matriz.cpp:68:38: error: passing 'const Matriz' as 'this' argument of 'const int Matriz::consultar(int, int)' discards qualifiers [-fpermissive]
Matriz.cpp: In member function 'void Matriz::sumar(const Matriz&)':
Matriz.cpp:101:72: error: passing 'const Matriz' as 'this' argument of 'const int Matriz::consultar(int, int)' discards qualifiers [-fpermissive]
Matriz.cpp: In member function 'void Matriz::multiplicar(const Matriz&, int)':
Matriz.cpp:111:75: error: passing 'const Matriz' as 'this' argument of 'const int Matriz::consultar(int, int)' discards qualifiers [-fpermissive]


Y el código de la clase en la que salta el error es este:
Código (cpp) [Seleccionar]
#include <iostream>
#include <vector>

using namespace std;

class Matriz {

private:
 
 int filas;
 int columnas;
 int **matr;

public:

 //Constructora
 Matriz(int filas, int columnas);
 
 //Constructora-copiadora
 Matriz(const Matriz &mat);
 
 //Destructora
 ~Matriz();
 
 //Consultoras
 const int consultar_filas();
 const int consultar_columnas();
 const int consultar(int fila, int columna);
 
 //Modificadora
 void modificar(int fila, int columna, int x);
 void sumar(const Matriz &mat);
 void multiplicar(const Matriz &mat, int pos);
 
 //Entrada / Sortida
 void leer();
 void escribir();
};

Matriz::Matriz(int filas, int columnas)
{
 this->filas = filas;
 this->columnas = columnas;
 
 matr = new int* [filas];
 for (int i = 0; i < filas; ++i)
 {
   matr[i] = new int [columnas];
 }
}

Matriz::Matriz(const Matriz &mat)
{
 this->filas = mat.consultar_filas();
 this->columnas = mat.consultar_columnas();
 
 matr = new int* [filas];
 for (int i = 0; i < filas; ++i)
 {
   matr[i] = new int [columnas];
 }
 
 
 for (int i = 0; i < filas; ++i)
 {
   for (int j = 0; j < columnas; ++j)
   {
     matr[i][j] = mat.consultar(i, j);
   }
 }
}

Matriz::~Matriz()
{
 delete[] matr;
}

const int Matriz::consultar_filas()
{
 return this->filas;
}

const int Matriz::consultar_columnas()
{
 return this->columnas;
}

const int Matriz::consultar(int fila, int columna)
{
 return this->matr[fila][columna];
}

void Matriz::modificar(int fila, int columna, int x)
{
 matr[fila][columna] = x;
}

void Matriz::sumar(const Matriz &mat)
{
 for (int i = 0; i < filas; ++i)
   for (int j = 0; j < columnas; ++j) matr[i][j] += mat.consultar(i, j);
}

void Matriz::multiplicar(const Matriz &mat, int pos)
{
 for (int i = 0; i < filas; ++i)
 {
   for (int j = 0; j < columnas; ++j)
   {
     int res = 0;
     for (int k = 0; k < pos; ++k) res += matr[i][k] * mat.consultar(k, j);
     matr[i][j] = res;
   }
 }
}

void Matriz::leer()
{
 for (int i = 0; i < filas; ++i)
   for (int j = 0; j < columnas; ++j) cin >> matr[i][j];
}

void Matriz::escribir()
{
 for (int i = 0; i < filas; ++i)
 {
   for (int j = 0; j < columnas; ++j) cout << matr[i][j] << " ";
   cout << endl;
 }
}


Si elimino la etiqueta const de las tres funciones que devuelven un error al compilar, el error desaparece, pero me gustaría saber el porque de este error, ya que los métodos que utilizo con el objeto constante no son modificadores, e incluso he probado a hacer los métodos constantes por si acaso, pero ni con esas.

Gracias!




Al final he conseguido averiguar cual era el problema. Si colocas la etiqueta const delante de una función, estás indicando que el resultado de ésta sera de un tipo constante. En cambio, si lo colocas detrás, estás diciendo que la función no modificará ningún parámetro. Por lo tanto, la solución al error es cambiar las etiquetas de sitio y ponerlas detrás de la función. De esta manera le aseguras al compilador que esa función no modificará ningún parámetro.

Saludos
#152
Mientras desarrollaba una pequeña clase Matriz, me ha surgido una duda: ¿Que diferencia hay entre usar una constructora copiadora o igualar dos objetos (ej: mat1 = mat2, siendo mat1 y mat2 objetos de la clase Matriz)?
En este caso, la constructora-copiadora hacía uso de los típicos dos bucles for para recorrer toda la matriz y ir copiandola al parámetro implícito (formato constructora: Matriz(Matriz &mat); ), pero me ha surgido la duda de si era más eficiente igualar dos objetos de tipo matriz y olvidarme de la constructora-copiadora. Por eso, me gustaría saber que ocurre realmente cuando igualas dos objetos del mismo tipo.

Saludos y gracias.
#153
Desafíos - Wargames / Re: Duda lenguaje HTML
11 Noviembre 2013, 17:40 PM
Cita de: superkorlas en 18 Septiembre 2013, 09:32 AM
Eso si, pero como no entiendo ese lenguaje (solo deduzco algunas cosas porque se parece a cosas que e visto en otros lenguajes o incluso a algo que e visto en cracking), por eso digo si conoceis de algun manual que te enseñe esa parte del lenguaje y no su totalidad.
Muchas gracias.

No vas a encontrar ningún tutorial que te explique ESE mismo código. Si quieres aprender a resolver este tipo de retos, no te sirve aprender solo lo que se te pide. Aprende el lenguaje, y entonces aplica tus conocimientos para resolver el reto. De nada te va a servir aprender a superar este reto si te dedicas solo a estudiar esas funciones tan básicas.
#154
Cita de: Stakewinner00 en 11 Noviembre 2013, 15:54 PM
Para usar un windows que se parezca a un linux pero de menor calidad ya uso linux  :laugh:

Hombre, depende de como lo mires. Yo que me considero gamer, no podría substituir mi Windows por un Linux, por mucho que sea un SO de "menor calidad". Eso si, para trabajar nada mejor que Linux. Podríamos decir que cada uno tiene un uso distinto.

Saludos
#155
WarZone / Re: Reto Warzone Muy Sencillito
6 Noviembre 2013, 19:36 PM
Cita de: BlackM4ster en  6 Noviembre 2013, 08:19 AM
Ni Google lo encuentra... como se hace para ocultarle algo a Google en una web?  :silbar:

Pfff vale, ya lo he encontrado... Y mira que estuve buscándo como ocultar una web de google, pero no se me encendió la bombilla como me ha pasado ahora. Gracias ^^

El nivel 19 es el último verdad?
#156
WarZone / Re: Reto Warzone Muy Sencillito
5 Noviembre 2013, 14:26 PM
Cita de: BlackM4ster en  5 Noviembre 2013, 08:14 AM
En los textos hay una gran pista

No se si te refieres a lo de google, pero del warzone en google solo aparece el primer nivel y un par de paginas más que no tienen nada que ver con el nivel 19... :l
Y si no es eso, no tengo ni idea de cual es la pista... Me he leido y releido los mensajes mil veces y no veo nada sospechoso aparte de lo de google vv'
#157
WarZone / Re: Reto Warzone Muy Sencillito
4 Noviembre 2013, 20:17 PM
Por dios, llevo horas intentando resolver el 11. Tengo el nombre del admin y he entrado en su cuenta, pero no se de donde sacar la dichosa contraseña TT.

Darme una pista porfavor... Ya no se que hacer!


EDITO--------------------------

Olvidadlo, ya tengo el MD5... No se si es que estoy haciendolo de manera distinta a la que deberia, pero modificando cabeceras o te fijas muy bien o te pasa lo que a mi, que he estado casi 2h en el mismo nivel...

Ahora estoy atascado en el 19. Tengo el admin y tengo el password, pero no se donde tiene el panel de administrador... Le he aplicado fuerza bruta pero ni con esas... :S Alguna pista?