Problema de matriz multidimensional dinámica de C ++

Estoy desarrollando un juego de plataformas en 2d. Todo estuvo bien hasta que tuve un problema difícil de resolver. El mapa de nivel se almacena en una matriz dinámica de múltiples dimensiones (mapa de caracteres **). Funciona bien, hasta que quiero redefinirlo.

Aquí está la parte del código:

Map& Map::operator=(const Map& rhs)
{
    if(width!=0||height!=0)
    {
        for(int i=0;i<width;i++)
            delete[] map[i];
        delete[] map;
    } //deleting previously created array

    height=rhs.height;
    width=rhs.width; //receiving other map's size

    map=new char* [width];
    walkmap=new unsigned char* [width];
    objmap=new char* [width];
    for(int i=0;i<width;i++)
    {
        *(map+i)=new char[height];
    } //creating new array

    for(int h=0;h<height;h++)
        for(int w=0;w<width;w++)
        {
            map[w][h]=rhs.map[w][h];
        } //receiving new values

    //...
}

Todo funciona bien por primera vez, pero cuando necesito redefinir la matriz por segunda vez, mi programa se bloquea en la parte, cuando la matriz recibe nuevos valores de otra. Puede que me pierda algo, ¡pero no puedo encontrarlo! Estaba buscando este problema, pero no encontré lo que estaba haciendo mal. Ayudame por favor.

preguntado el 10 de mayo de 11 a las 13:05

Has dejado la declaración del tipo (¿def?) Map, que es bastante importante para la pregunta. -

Tambien yo cambiaria *(map+i) a map[i] solo porque es mucho más descriptivo de lo que está tratando de lograr con esa línea en mi humilde opinión. -

2 Respuestas

Como siempre, Boost tiene una clase de matriz multidimensional elegante y eficiente en memoria:

http://www.boost.org/doc/libs/1_39_0/libs/multi_array/doc/user.html

Por ejemplo, para configurar una matriz de 10 x 20 de valores bool:

 
    boost::multi_array  mtaFlagMatrix(boost::extents[10][20]);
 

Luego para acceder a sus elementos:

 
    mtaFlagMatrix[2][6] = false; // indexes are zero-based - just like normal C arrays
     ...
    if ( mtaFlagMatrix[2][6] )
    {
       ...
    }
 

Luego, puede cambiar el tamaño de la matriz de esta manera (los valores existentes se conservan):

 
typedef boost::multi_array array_type;

array_type::extent_gen extents; array_type A(extents[3][3][3]); A[0][0][0] = 4; A[2][2][2] = 5; A.resize(extents[2][3][4]); assert(A[0][0][0] == 4); // A[2][2][2] is no longer valid.

Esto me ahorró mucho tiempo probando casos extremos.

contestado el 10 de mayo de 11 a las 18:05

Oh, no quiero usar componentes adicionales, porque mi código será difícil de entender. No necesito cambiar el tamaño muy a menudo. ¡Solo 2 o 3 veces! Y el uso de bibliotecas no me ayudará a entender cuándo me equivoqué. D: - sentimiento

Su matriz 2d no se libera correctamente. Le aconsejo que utilice la forma Iliffe de asignar matrices 2d, que es más rápida y segura de usar:

char** alloc_array( int h, int w )
{
  typedef char* cptr;
  int i;
  char** m = new cptr[h];
  m[0] = new char[h*w];
  for(i=1;i<h;i++) m[i] = m[i-1]+w;
  return m;
}

void release_array(char** m)
{
  delete[] m[0];
  delete[] m;
}

int main()
{
  int r,c;
  char** tab;
  int width  = 5;
  int height = 3;
  tab = alloc_array(height, width); /* column first */

  for(r = 0;r<height;++r)
   for(c = 0;c<width;++c)
    tab[r][c] = (1+r+c);

  for(r = 0;r<height;++r)
  {
    for(c = 0;c<width;++c)
    {
      printf("%d\t",tab[r][c]);
    }
    puts("");
  }
  release_array(tab);
}

Esto se puede encapsular fácilmente en una ordenada clase de matriz 2d o hacer que use std :: vector en lugar de una asignación sin procesar. Prefiera esta forma de hacer una matriz 2d ya que es compatible con el caché, el estilo proporciona el acceso [] [] y no es más lento y algunas veces más rápido que el acceso polinomial 1d.

contestado el 10 de mayo de 11 a las 17:05

Gracias, intentaré utilizar este método. sentimiento

Aww, el mismo problema. Funciona bien por primera vez, luego elimino la matriz creada anteriormente, creo una nueva matriz (todo está bien ahora), pero cuando comienzo a asignar algunos valores nuevos a la nueva matriz, el programa se bloquea nuevamente, lo mismo está en mi código. - sentimiento

estás haciendo algo mal en otra parte. ¿Puedes mostrarme tu código actualizado usando estas funciones? Joel Falcou

pastebin.com/Gtvnf2wA Aquí está. (Por primera vez rhs.tileset! = 0, pero primero es 0 - sentimiento

Ah, y las otras matrices usan el mismo método (pero no se muestra en el código) - sentimiento

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.