elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


  Mostrar Temas
Páginas: 1 [2]
11  Programación / Programación General / Algoritmo para pintar el interior de una figura en una matriz (¿BFS?) en: 7 Diciembre 2013, 18:51 pm
Estoy desarrollando un juego en el que nuestro personaje se encarga de pintar una superficie (una matriz a nivel de código). El problema es que quiero implementar que una vez ha pintado el relieve de una figura cerrada, se pinte también el interior.


El funcionamiento del juego es como el de cualquier tile-based game: El mapa es una matriz de enteros. Cada posición contiene un entero que determina que textura tendrá esa casilla y si el personaje puede pasar por encima de ella. Por lo tanto, podemos definir que las casillas se encuentran inicialmente en 0 (excepto los muros, que diremos que son -1), y que cuando pasan por encima, cambiamos su valor a 1.

Entonces, el problema a nivel de código es identificar en una matriz una figura cerrada hecha a base de 1s. Había pensado en un BFS, pero no estoy seguro de que sea la mejor opción. ¿Se os ocurre algún otro método más eficiente para hacer esto?

Saludos y gracias.
12  Programación / Programación C/C++ / [SOLUCIONADO] C++ - Error con memoria dinámica: ¿Puntero por referencia? en: 21 Noviembre 2013, 01:21 am
Dadas dos funciones, necesito pasar un puntero por referencia de una función a la otra para obtener los datos de una lista de strings (las dos funciones están dentro de la misma clase).
El problema viene dado a que desde un objeto de esa clase, necesito acceder a datos privados de otro objeto del mismo tipo (una lista de strings). Entonces, la solución más eficiente que se me ha ocurrido es crear un puntero de tipo vector<string> vect, pasarlo por referencia a la otra función, y en esa hacer vect = new vector<string> (N), donde N es el tamaño de la lista de la que quiero obtener sus elementos, pero me da errores de compilación y no consigo resolverlos.

Os adjunto el código de las dos funciones implicadas y el error recibido al compilar (compilo en Linux con G++):

NOTA: La primera función empieza en la línea 33, y la segunda en la línea 71, por lo que los errores saltan en las líneas marcadas con el comentario ERROR EN ESTA LÍNEA.

Código
  1. #include <vector>
  2. #include <list>
  3.  
  4. list<string> lista; //Esto está declarado en la parte privada de la clase
  5.  
  6. void Objeto::fusion_objeto(const Objeto &rev)
  7. {
  8.  //Declaro puntero
  9.  vector<string> *s = NULL;
  10.  rev.func_aux(s);
  11.  int n = s->size();
  12.  for (int i = 0; i < n; ++i) lista.insert(lista.begin(), s[i]); //ERROR EN ESTA LÍNEA
  13.  delete s;
  14. }
  15.  
  16. void Objeto::func_aux(vector<string>* &s)
  17. {
  18.  int N = lista.size();
  19.  s = new vector<string> (N);
  20.  list<string>::iterator it = lista.begin();
  21.  for (int i = 0; i < N; ++i)
  22.  {
  23.    s[i] = *it; //ERROR EN ESTA LÍNEA
  24.    ++it;
  25.  }
  26. }
  27.  

Error de la primera función:
Código:
Objeto.cpp: In member function ‘void Objeto::fusion_objeto(const Objeto&)’:
Objeto.cpp:39:69: error: no matching function for call to ‘std::list<std::basic_string<char> >::insert(std::list<std::basic_string<char> >::iterator, std::vector<std::basic_string<char> >&)’
Objeto.cpp:39:69: note: candidates are:
In file included from /usr/include/c++/4.7/list:65:0,
                 from Objeto.hpp:8,
                 from Objeto.cpp:1:
/usr/include/c++/4.7/bits/list.tcc:99:5: note: std::list<_Tp, _Alloc>::iterator std::list<_Tp, _Alloc>::insert(std::list<_Tp, _Alloc>::iterator, const value_type&) [with _Tp = std::basic_string<char>; _Alloc = std::allocator<std::basic_string<char> >; std::list<_Tp, _Alloc>::iterator = std::_List_iterator<std::basic_string<char> >; std::list<_Tp, _Alloc>::value_type = std::basic_string<char>]
/usr/include/c++/4.7/bits/list.tcc:99:5: note:   no known conversion for argument 2 from ‘std::vector<std::basic_string<char> >’ to ‘const value_type& {aka const std::basic_string<char>&}’
In file included from /usr/include/c++/4.7/list:64:0,
                 from Objeto.hpp:8,
                 from Objeto.cpp:1:
/usr/include/c++/4.7/bits/stl_list.h:1104:7: note: void std::list<_Tp, _Alloc>::insert(std::list<_Tp, _Alloc>::iterator, std::list<_Tp, _Alloc>::size_type, const value_type&) [with _Tp = std::basic_string<char>; _Alloc = std::allocator<std::basic_string<char> >; std::list<_Tp, _Alloc>::iterator = std::_List_iterator<std::basic_string<char> >; std::list<_Tp, _Alloc>::size_type = long unsigned int; std::list<_Tp, _Alloc>::value_type = std::basic_string<char>]
/usr/include/c++/4.7/bits/stl_list.h:1104:7: note:   candidate expects 3 arguments, 2 provided
/usr/include/c++/4.7/bits/stl_list.h:1125:9: note: template<class _InputIterator> void std::list::insert(std::list<_Tp, _Alloc>::iterator, _InputIterator, _InputIterator) [with _InputIterator = _InputIterator; _Tp = std::basic_string<char>; _Alloc = std::allocator<std::basic_string<char> >]
/usr/include/c++/4.7/bits/stl_list.h:1125:9: note:   template argument deduction/substitution failed:
Objeto.cpp:39:69: note:   candidate expects 3 arguments, 2 provided


Error de la segunda función:
Código:
Objeto.cpp: In member function ‘void Objeto::func_aux(std::vector<std::basic_string<char> >*&)’:
Objeto.cpp:78:13: error: no match for ‘operator=’ in ‘*(s + ((sizetype)(((long unsigned int)i) * 24ul))) = it.std::_List_iterator<_Tp>::operator*<std::basic_string<char> >()’
Objeto.cpp:78:13: note: candidate is:
In file included from /usr/include/c++/4.7/vector:70:0,
                 from Objeto.hpp:9,
                 from Objeto.cpp:1:
/usr/include/c++/4.7/bits/vector.tcc:161:5: note: std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(const std::vector<_Tp, _Alloc>&) [with _Tp = std::basic_string<char>; _Alloc = std::allocator<std::basic_string<char> >]
/usr/include/c++/4.7/bits/vector.tcc:161:5: note:   no known conversion for argument 1 from ‘std::basic_string<char>’ to ‘const std::vector<std::basic_string<char> >&’

Tiene pinta de que acceda mal a las posiciones del vector dinámico. He probado con lo siguiente, pero lógicamente no funciona.
Código:
*(s[i])

¿Alguna idea?

Saludos y gracias
13  Programación / Programación C/C++ / C++ - Duda sobre el consumo de memoria de listas enlazadas y structs. en: 19 Noviembre 2013, 02:15 am
Considerando las siguientes implementaciones:

Código
  1. vector< list<Objeto> > list_1(N);
  2. vector< list<Revistes>::iterator > list_2(N);
  3.  

Código
  1. struct Conj {
  2.  Objeto obj;
  3.  list<Objeto>::iterator it; //puntero a un objeto contenido en una lista del tipo especificado
  4. }
  5.  
  6. vector< list<Conj> > list_rev(N);
  7.  

¿Cual creeis que consume menos memoria? Ya que a simple vista guarda los mismos datos, pero lo que me hace dudar es la información de más que puede generar un struct, un vector o una lista enlazada para funcionar correctamente, ya que estas últimas por ejemplo, por cada posición de la lista se guardan dos punteros para referenciar al elemento anterior y al siguiente.

Saludos



Solucionado: La segunda opción consume menos memoria que la primera, ya que por cada lista de más que generemos, aumentamos los punteros totales que utiliza el programa. En canvio, un struct guarda los datos en bloques y no necesita de datos adicionales para funcionar, por lo tanto nos ahorramos los punteros de una lista.

Saludos
14  Programación / Programación C/C++ / Aporte - C++ Sockets Library en: 17 Noviembre 2013, 02:42 am
Buscando guias sobre el uso de sockets en C++, he encontrado esta libreria que puede ser muy útil, sobre todo si lo que se busca es crear un código sencillo y fácil de entender, algo parecido a lo que ocurre con la clase socket en C#. Aquí teneis la descripción:

Citar
Esta es una libreria de clases en C++ bajo licencia GPL que 'mapea' el berkeley sockets C API, y funciona tanto en algunos sistemas unix como en win32. Las características incluidas, aunque no limitadas son: SSL support, IPv6 support, tcp and udp sockets, encrypted tcp, http protocol, altamente configurable el manejo de errores. Las pruebas de Testeo han sido efectuadas en: Linux and Windows 2000, and to some part on Solaris and Mac OS X.

Enlace: http://www.alhem.net/Sockets/index_spanish.html

La propia página web incluye un tutorial y ejemplos de uso de la clase Socket y SocketHandler (ambas incluidas en la libreria), y distintas descargas (entre las que está la documentación de las clases generada por Doxygen). Está disponible en inglés y español, aunque recomiendo la versión inglesa por la mala traducción del sitio.

Saludos
15  Programación / Programación C/C++ / [SOLUCIONADO] C++ - Error al usar "const" en funciones de una clase. en: 13 Noviembre 2013, 02:10 am
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++):

Código:
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
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. class Matriz {
  7.  
  8. private:
  9.  
  10.  int filas;
  11.  int columnas;
  12.  int **matr;
  13.  
  14. public:
  15.  
  16.  //Constructora
  17.  Matriz(int filas, int columnas);
  18.  
  19.  //Constructora-copiadora
  20.  Matriz(const Matriz &mat);
  21.  
  22.  //Destructora
  23.  ~Matriz();
  24.  
  25.  //Consultoras
  26.  const int consultar_filas();
  27.  const int consultar_columnas();
  28.  const int consultar(int fila, int columna);
  29.  
  30.  //Modificadora
  31.  void modificar(int fila, int columna, int x);
  32.  void sumar(const Matriz &mat);
  33.  void multiplicar(const Matriz &mat, int pos);
  34.  
  35.  //Entrada / Sortida
  36.  void leer();
  37.  void escribir();
  38. };
  39.  
  40. Matriz::Matriz(int filas, int columnas)
  41. {
  42.  this->filas = filas;
  43.  this->columnas = columnas;
  44.  
  45.  matr = new int* [filas];
  46.  for (int i = 0; i < filas; ++i)
  47.  {
  48.    matr[i] = new int [columnas];
  49.  }
  50. }
  51.  
  52. Matriz::Matriz(const Matriz &mat)
  53. {
  54.  this->filas = mat.consultar_filas();
  55.  this->columnas = mat.consultar_columnas();
  56.  
  57.  matr = new int* [filas];
  58.  for (int i = 0; i < filas; ++i)
  59.  {
  60.    matr[i] = new int [columnas];
  61.  }
  62.  
  63.  
  64.  for (int i = 0; i < filas; ++i)
  65.  {
  66.    for (int j = 0; j < columnas; ++j)
  67.    {
  68.      matr[i][j] = mat.consultar(i, j);
  69.    }
  70.  }
  71. }
  72.  
  73. Matriz::~Matriz()
  74. {
  75.  delete[] matr;
  76. }
  77.  
  78. const int Matriz::consultar_filas()
  79. {
  80.  return this->filas;
  81. }
  82.  
  83. const int Matriz::consultar_columnas()
  84. {
  85.  return this->columnas;
  86. }
  87.  
  88. const int Matriz::consultar(int fila, int columna)
  89. {
  90.  return this->matr[fila][columna];
  91. }
  92.  
  93. void Matriz::modificar(int fila, int columna, int x)
  94. {
  95.  matr[fila][columna] = x;
  96. }
  97.  
  98. void Matriz::sumar(const Matriz &mat)
  99. {
  100.  for (int i = 0; i < filas; ++i)
  101.    for (int j = 0; j < columnas; ++j) matr[i][j] += mat.consultar(i, j);
  102. }
  103.  
  104. void Matriz::multiplicar(const Matriz &mat, int pos)
  105. {
  106.  for (int i = 0; i < filas; ++i)
  107.  {
  108.    for (int j = 0; j < columnas; ++j)
  109.    {
  110.      int res = 0;
  111.      for (int k = 0; k < pos; ++k) res += matr[i][k] * mat.consultar(k, j);
  112.      matr[i][j] = res;
  113.    }
  114.  }
  115. }
  116.  
  117. void Matriz::leer()
  118. {
  119.  for (int i = 0; i < filas; ++i)
  120.    for (int j = 0; j < columnas; ++j) cin >> matr[i][j];
  121. }
  122.  
  123. void Matriz::escribir()
  124. {
  125.  for (int i = 0; i < filas; ++i)
  126.  {
  127.    for (int j = 0; j < columnas; ++j) cout << matr[i][j] << " ";
  128.    cout << endl;
  129.  }
  130. }
  131.  

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
16  Programación / Programación General / POO - ¿Diferencia entre usar una constructora-copiadora a Objeto = Objeto? en: 13 Noviembre 2013, 01:52 am
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.
Páginas: 1 [2]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines